在不使用循环的情况下在ObservableCollection中查找项

Pet*_*erP 31 c# collections wpf

目前我有以下语法(list是包含具有许多不同属性的对象的列表(其中Title是其中之一):

for (int i=0; i < list.Count; i++)
{
   if(title == list[i].Title)
   {
    //do something
   }
}
Run Code Online (Sandbox Code Playgroud)

如何在list[i].Title不必遍历整个集合的情况下访问它?由于我的列表越来越大,这可能会影响我的程序的性能.

我在我的程序中有很多类似的语法(通过for循环和索引访问公共属性).但我确定必须有一个更好,更优雅的方式来做到这一点?

由于我的列表包含对象,因此find方法似乎确实是一个选项.

Tig*_*ran 48

我不知道你究竟是什么意思,但从技术上讲,如果没有循环,这是不可能的.

可能是指使用LINQ,例如:

list.Where(x=>x.Title == title)
Run Code Online (Sandbox Code Playgroud)

值得一提的是,迭代结束不会被跳过,而是简单地包含在LINQ查询中.

希望这可以帮助.

编辑

换句话说,如果您真的关心性能,请按照您已经做的方式进行编码.否则,请选择LINQ以获得更简洁明了的语法.

  • @Tigran 使用 LINQ 而不是 for 循环不会以任何明显的方式降低性能(即使是速度测试也不行)。 (2认同)

Pat*_*iek 32

Linq来了:

var listItem = list.Single(i => i.Title == title);
Run Code Online (Sandbox Code Playgroud)

如果没有与谓词匹配的项,则抛出异常.或者,有SingleOrDefault.

如果你想要一个与标题匹配的项目集合,那就是:

var listItems = list.Where(i => i.Title ==  title);
Run Code Online (Sandbox Code Playgroud)

  • 这是寻找任何满足特定条件的对象的答案。 (2认同)

use*_*uld 5

我建议将它们存储在哈希表中。然后,您可以使用键访问集合中的项目,这是一种更有效的查找。

var myObjects = new Hashtable();
myObjects.Add(yourObject.Title, yourObject);
...
var myRetrievedObject = myObjects["TargetTitle"];
Run Code Online (Sandbox Code Playgroud)


小智 5

如果你不需要索引,我必须使用它作为条件添加

using System.Linq;
Run Code Online (Sandbox Code Playgroud)

使用

if(list.Any(x => x.Title == title){
// do something here
}
Run Code Online (Sandbox Code Playgroud)

这将告诉您任何变量是否满足您的给定条件.