LINQ on IList of objects

时间:2013-12-11 09:02:52

标签: c# linq

我有一个物体的对象

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'的查询模式的实现。''找不到的地方。”

请告知

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分: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"项将只是一个数组元素。如果是这样,请参阅其他用户jenson-button-event的answer

如果您有数据行列表或某些索引结构,那么您应该使用该结构的类型而不是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();