2013-12-11 4 views
0

У меня есть IList объектовLINQ на IList объектов

IList list = new List<object[]>(); 

Я хочу, чтобы определить, в списке объекта, который элемент имеет object["name"]="No Name" и object["lastName"]="No Name".

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

var myElem= from x in list 
    where x.Field<string>("NAME")=="No Name" 
    select x.toList(); 

И я получаю:

«Не удалось найти реализацию шаблона запроса для типа источника 'System.Collections.IList'. «Где» не найдено ».

Пожалуйста посоветуйте

ответ

0

Проблема заключается в том, что LINQ не поддерживается на необработанных коллекций, только на общих из них. Таким образом, вы должны сделать свой список родовым так:

var myElem = from x in list.Cast<object[]> 
    where // some condition 
    select x.toList(); 

Cast<object[]> заставит list лечиться как IEnumerable<object[]>, следовательно, сделать его общим перечислим и позволяет выражение LINQ.

Теперь, обратно к вашему коду, объект ["name"] кажется незаконным выражением в C#, поскольку объект не поддерживает такой доступ. В случае, если list действительно представляет собой массив объектов, полученный из некоторого источника данных, то элементы "name" и "lastName" будут просто элементами массива. Если это так, обратитесь к answer другого пользователя jenson-button-event.

Если у вас есть список строк данных или какая-либо индексируемая структура, вы должны использовать тип этой структуры вместо object[]. Например, если вы используете DataRow, код должен выглядеть следующим образом:

IList list = new List<DataRow>(); 
var myElem = from x in list.Cast<DataRow> 
    where x["name"] == "No Name" || x["lastName"] == "No Name" 
    select x.toList(); 

Или еще лучше (чтобы избежать необработанных коллекций):

IList<DataRow> list = new List<DataRow>(); 
var myElem = from x in list 
    where x["name"] == "No Name" || x["lastName"] == "No Name" 
    select x.toList(); 
+0

'' list' уже IEnumerable' – Grundy

+0

@Grundy, 'IList' не _generic_ перечислим. Linq включен только для общих экземпляров. –

+1

@ IvayloSlavov yep, вы правы, не обращали внимания на то, что присваиваете 'IList' как интерфейс, а не общий – Grundy

2

У вас есть список массивов объектов. Объектные массивы не имеют аксессуар для строк, поэтому object["name"]="No Name" не имеет смысла. Вы можете получить доступ только по порядковому номеру: x[0] == "No Name" или попробуйте Any

Также создайте свой первоначальный список как общий, чтобы облегчить первоначальную ошибку.

IList<object[]> list = new List<object[]>(); 

var myElem = from x in list 
    where x.Any(y => y.ToString() == "No Name") 
    select x.toList(); 
+2

' == 'оператор на' object' и 'string'? Компилятору это не нравится. –

+0

Похоже, что компилятор написан Тимом Шмельтером – user2483797

Смежные вопросы