我正在尝试查找其“tag”属性不等于null的ArrayList的第一个元素的索引。
我以为我可以做些什么来影响
ArrayList.IndexOf(p => p.tag != null);
或
ArrayList.IndexOf(*.tag != null);
但这些都不起作用。有没有办法只使用一个对象的属性IndexOf?
答案 0 :(得分:2)
搜索匹配的元素 由...定义的条件 指定谓词,并返回 第一个从零开始的索引 在整个数组中出现。
答案 1 :(得分:0)
如果切换到使用通用List而不是ArrayList,则可以执行以下操作:
int index = list.FindIndex(p => p.tag != null);
否则,你不得不在数组列表中手动( gasp )循环。
答案 2 :(得分:0)
如果你知道对象的类型,你可以做这样的事情
ArrayList list = ...;
var elem = list.Cast<T>().Select((item,i) => new {item,Index = i}).FirstOrDefault(p => p.item.tag == null);
var index = elem != null ? elem.Index : -1;
如果你知道至少有一个(你没有那么有效的头脑),那么会有效
Cast将IEnumerable
转换为IEnumerable<T>
打开通往LINQ其余部分的大门
答案 3 :(得分:0)
int index = a.Cast<T>()
.Select((p, q) => p != null && p.tag != null ? q + 1 : 0)
.FirstOrDefault(p => p > 0) - 1;
如果找不到元素,则返回-1
。
答案 4 :(得分:0)
IndexOf的问题在于您必须在集合中将Object用作参数。它不是LINQ扩展。这就是它失败的原因,因为你的lambda不在集合中。
您还可以使用以下LINQ查询
ArrayList.IndexOf(ArrayList.First( x => p.tag != null ))
但就性能而言,它会有点差(通过两次收集)
您应该按照我的智能答案的建议重构您的代码。
答案 5 :(得分:0)
如果你想在仍然使用ArrayList时想要这样做,你可以简单地调用ToArray()然后执行你的FindIndex