Как отличить от объекта [], сохраненного как объект в C #

У меня есть List<object>база данных. Каждый объект [] Еогеасп ( объект элемент в списке ) { если ( элемент . GetType (). IsArray ) { вар обр = элемент , как INT []; foreach ( var i in arr ) print ( i ); } } состоит из состоящего из var listValues = new List <object> (); var newItem = item as object[]; var newArray = новый объект [ 10 ]; newArray [ 0 ] = ( int ) c . Тег ; newArray [ 1 ] = ( int ) c . FPos ; newArray [ 2 ] = ( int ) c . ToL ; listValues . Добавить ( newArray ); значения.

Я могу сохранять, просматривать и извлекать данные. Я могу просмотреть данные в отладчике. Но я не могу отбрасывать int или int.

object

В выражении if элемент показывает данные в отладчике, изображенном ниже, но является ложным, но как мне вернуть объект []?

введите описание изображения здесь

Я также пробовал:

int[]

Изменить: Вот как я инициализирую int []. Я начинаю с объекта, потому что у меня возникают ошибки при обработке, если я пытаюсь обернуть объект [] при отправке в базу данных.

object

c#,arrays,object,

2

Ответов: 2


2

Литой (обычно) отличается от преобразования . В большинстве случаев, когда вы бросаете вещи на C #, вы предполагаете, что это уже то, что вы говорите, и вы вообще не меняете их. Существует исключение для типов значений, таких как int«boxed» и «unboxed», когда вы отправляете их в и из object. Однако это исключение не распространяется на листинг a Cast<>()в a .int[] arr = ((object[])item).Cast<int>().ToArray();

Это int[]не то же самое, что и object[], так что вы не можете просто бросить его как один. Вместо этого вам нужно создать новый массив (или Collection, или IEnumerable или что-то еще), который состоит из всех этих objects unboxed в int. Один из способов сделать это - использовать метод расширения из пространства имен System.Linq.List<object[]> list = new List<object[]> { new object[] { 1, 2 }, new object[] { 3, 4 } }; foreach (object[] item in list) { if (item.GetType().IsArray) { var arr = item.Cast<int>(); foreach (var i in arr) { Console.WriteLine(i); } } }

List<object>

Или, как более полный пример:

foreach (List<object> item in list)
{
    int[] arr = item.Cast<int>().ToArray();
    foreach (var i in arr)
    {
        Console.WriteLine(i);
    }
}

Обновить

Основываясь на вашем обновленном вопросе, есть вероятность, что реальное решение вашей проблемы выйдет за рамки исходного вопроса. Я не знаю, какой механизм вы используете для его хранения и извлечения из базы данных, но если вы используете что-то вроде Entity Framework, вам, вероятно, придется изменить свою модель, чтобы ее значения были строго типизированы. Фактически, то, как вы берете свойства объекта и помещаете их в базу данных в виде массива, - это большой запах кода: скорее всего, ваша модель данных должна быть сплющена в тип с именованными свойствами.

Но чтобы ответить на самую простую, самую основную часть вопроса: вы должны отбросить свои объекты к типу, который есть на самом деле , прежде чем пытаться их преобразовать. Если у вас есть array, то используйте это:

List

1

После выбора ваших предметов из БД вы не получите реального array. Вместо этого вы получаете тот, item.GetType().IsArrayкоторый нельзя просто отличить от типа массива. Таким образом, Listэто также неверно, поскольку этоList

Попробуйте следующее:

foreach (object item in list)
{
       IEnumerable<object> itemAsObjectEnumerable = (IEnumerable<object>)item;
       IEnumerable<int> itemAsIntEnumerable = itemAsObjectEnumerable.Cast<int>();
       foreach (var i in itemAsIntEnumerable)
       {
            print(i);
       }
}
C #, массивы, объект,
Похожие вопросы