我有一个物体的对象
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 :(得分: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();