Member 11859517 Ответов: 2

Как преобразовать объект в массив nullable int в C#?


Привет,
Я хочу преобразовать тип объекта в nullable int array (int?[]) в c#, но я не получаю никакого решения, может ли кто-нибудь знать, как это сделать.
int?[] NullableIntArray{get;set;}

object value = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0];

NullableIntArray = value;


((IEnumerable)propertyValue).Cast<object>().Select(x => x.ToString()).ToArray(); using this I can convert object to string array
where
propertyValue = ["","",""];


likie this I want object to int? [].


Благодарим
сушил

Что я уже пробовал:

((IEnumerable)propertyValue).Cast

2 Ответов

Рейтинг:
1

Andy Lanng

Это сработает. Так ли это сейчас?

Лично я бы не стал делать это совсем так (но близко):

int?[] result = null;

var enumerable = propertyValue as IEnumerable; 
// will be null if not IEnumerable.  These checks are always valid

if(enumerable != null && enumerable.All(i=>i is int?) //or is INullable<int>.  they should be the same
  result = enumerable.Cast<int?>().ToArray()

return result;



Это вернет либо a int?[] или null.

Лично я бы добавил проверки, которые выбрасывают исключения, чтобы определить, почему я получаю null. В конце концов, это может быть другой объект или null int?[].

Это не сработало, так как "null is int?" всегда равно false.

Вместо этого замените на "i=>i==null | / i is int"

Вот полный модульный тест, который проходит:

[TestMethod]
public void TryPart1()
{

    int?[] value = new int?[10];
    for (int i = 0; i < value.Length; i++)
    {
        value[i] = (i > 4) ? (int?)null : 0;
    }

    object a = value;
    var result = TryPart2(a);

    Assert.IsTrue(result != null);
    Assert.IsTrue(result.Length == 10);

}

public int?[] TryPart2(object a)
{

    int?[] result = null;

    var enumerable = a as IEnumerable;

    if (enumerable != null)
    {
        var objects = enumerable.Cast<object>().ToArray();
        if (objects.All(o => o==null || o is int))
            result = objects.Cast<int?>().ToArray();

    }

    return result;
}


Member 11859517

Спасибо Энди Лэнг,
это не работает для меня давая ошибку

Необработанное исключение типа ' System.Которого вызывается invalidcastexception произошел в System.Core.dll
Дополнительная информация: указанное приведение недопустимо.

Andy Lanng

к-держись-проверю

Member 11859517

ладно.

Member 11859517

Я делаю что-то вроде
публичный инт?[] DEVICE_MAX_FILE_SIZE { get; set; }

ВАР перечислимое значение = значениесвойства как IEnumerable;

DEVICE_MAX_FILE_SIZE = перечисли.Литые

Andy Lanng

Просто используйте метод TryPart2, чтобы сделать это за вас.

Member 11859517

извини Энди Ланг,
это также не работает, давая такое же исключение.

Рейтинг:
0

Ehsan Sajjad

Вам нужно сделать это что-то вроде этого, я протестировал этот код на своей машине:

using System;
using System.Linq;
using System.Collections.Generic;
public class HelloWorld
{
	public static void Main()
	{
		
        int?[] NullableIntArray;
        object value = new object[]{"a",0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
        int result;
        NullableIntArray = ((IEnumerable<object>)value)
		                   .Select(x=>int.TryParse(x.ToString(),out result) ? (int?)result : (int?)null)
                           .ToArray();
	}
}