ArrayList.IndexOf(外卡?)

时间:2011-02-17 20:35:28

标签: c# .net collections

我正在尝试查找其“tag”属性不等于null的ArrayList的第一个元素的索引。

我以为我可以做些什么来影响

ArrayList.IndexOf(p => p.tag != null);

ArrayList.IndexOf(*.tag != null);

但这些都不起作用。有没有办法只使用一个对象的属性IndexOf?

6 个答案:

答案 0 :(得分:2)

尝试Array.FindIndex

  

搜索匹配的元素   由...定义的条件   指定谓词,并返回   第一个从零开始的索引   在整个数组中出现。

答案 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