C# ArrayList.IndexOf(通配符?)

C# ArrayList.IndexOf(通配符?),c#,.net,collections,C#,.net,Collections,我试图找到ArrayList的第一个元素的索引,该元素的'tag'属性不等于null 我想我可以做点什么来达到 ArrayList.IndexOf(p => p.tag != null); 或 但这两种方法都不管用。有没有一种方法可以仅对对象的属性使用IndexOf?试试: 搜索匹配的元素 定义的条件 指定的谓词,并返回 从零开始的第一个索引 发生在整个数组中 如果切换到使用常规列表而不是ArrayList,则可以执行以下操作: int index = list.FindIndex(p

我试图找到ArrayList的第一个元素的索引,该元素的'tag'属性不等于null

我想我可以做点什么来达到

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

但这两种方法都不管用。有没有一种方法可以仅对对象的属性使用IndexOf?

试试:

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


如果切换到使用常规列表而不是ArrayList,则可以执行以下操作:

int index = list.FindIndex(p => p.tag != null);

否则,您将不得不手动(喘息)遍历数组列表。

如果您知道对象的类型,您可以执行类似的操作

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;
ArrayList=。。。;
var elem=list.Cast().Select((item,i)=>new{item,Index=i}).FirstOrDefault(p=>p.item.tag==null);
var索引=元素!=无效的要素指数:-1;
如果你知道至少有一个(不是你认为的那么有效率的话)会起作用

Cast将一个
IEnumerable
转换为一个
IEnumerable
打开通向LINQ其余部分的门
int index = a.Cast<T>()
             .Select((p, q) => p != null && p.tag != null ? q + 1 : 0)
             .FirstOrDefault(p => p > 0) - 1;
.选择((p,q)=>p!=null&&p.tag!=null?q+1:0) .FirstOrDefault(p=>p>0)-1;
如果未找到元素,则返回
-1

IndexOf的问题是必须在集合中使用对象作为参数。它不是LINQ扩展。这就是为什么它会失败,因为lambda不在集合中

您还可以使用以下LINQ查询

ArrayList.IndexOf(ArrayList.First(x=>p.tag!=null))

但是关于性能,它会有点差(查看两次集合)


你应该按照我的智能答案建议重构你的代码。

如果你想在仍然使用ArrayList的情况下进行重构,你可以简单地调用ToArray(),然后执行FindIndex,ArrayList的“tag”属性是什么?如果可以,你应该使用List而不是ArrayList。ArrayList是“démod”.但请看下面我的解决方案。这是.NET2.0吗?LINQ甚至是一个选项吗?他使用的是lambdas,所以我认为它至少应该是3。0@yetanothercoder“tag”是ArrayList中用于数组的对象的属性。OP要求提供ArrayList。虽然我要求提供ArrayList,但转换为数组并使用Array.FindIndex解决了我的问题问题。
int index = a.Cast<T>()
             .Select((p, q) => p != null && p.tag != null ? q + 1 : 0)
             .FirstOrDefault(p => p > 0) - 1;