在“可观察集合”中查找项,而无需使用循环

本文关键字:循环 查找 观察 集合 可观察集合 | 更新日期: 2023-09-27 18:33:41

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

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

如何在不循环访问整个馆藏的情况下访问list[i].Title?由于我的列表往往会变大,这可能会影响程序的性能。

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

find 方法似乎确实是一个选项,因为我的列表包含对象。

在“可观察集合”中查找项,而无需使用循环

我不知道

到底是什么意思,但从技术上讲,如果没有循环,这是不可能的。

可能你的意思是使用 LINQ,例如:

list.Where(x=>x.Title == title)

值得一提的是,迭代不会跳过,而只是包装到 LINQ 查询中。

希望这有帮助。

编辑

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

Linq 来了:

var listItem = list.Single(i => i.Title == title);

如果没有与谓词匹配的项,则会引发异常。或者,还有SingleOrDefault.

如果需要与标题匹配的项目集合,可以:

var listItems = list.Where(i => i.Title ==  title);

如果您不需要索引,我必须将其用于条件添加

using System.Linq;

if(list.Any(x => x.Title == title){
// do something here
}

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

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

var myObjects = new Hashtable();
myObjects.Add(yourObject.Title, yourObject);
...
var myRetrievedObject = myObjects["TargetTitle"];

考虑创建索引。字典可以做到这一点。如果您需要列表语义,请子类并将索引保留为私有成员...

ObservableCollection是一个列表,所以如果你不知道元素的位置,你必须查看每个元素,直到找到预期的元素。

可能的优化如果元素已排序,请使用二叉搜索来提高性能,否则使用字典作为索引。

您正在寻找基于哈希的集合(如字典或哈希集),而 ObservableCollection 不是。最好的解决方案可能是从基于哈希的集合派生并实现INotifyCollectionChanged,这将为您提供与ObservableCollection相同的行为。

好吧,

如果你有 N 个对象并且你需要获取所有这些对象的标题,你必须使用循环。如果你只需要标题并且你真的想改进它,也许你可以制作一个只包含标题的单独数组,这将提高性能。在说这会损害性能之前,您需要定义可用的内存量和可以处理的对象数量,并且在任何情况下,解决方案都是更改程序的设计而不是算法。

也许这种方法可以解决问题:

int result = obsCollection.IndexOf(title);

指数(T)
搜索指定的对象,并返回整个集合中第一个匹配项的从零开始的索引。

(继承自收藏)

https://learn.microsoft.com/en-us/dotnet/api/system.collections.objectmodel.observablecollection-1?view=netframework-4.7.2#methods

可观察集合可以是列表

{
    BuchungsSatz item = BuchungsListe.ToList.Find(x => x.BuchungsAuftragId == DGBuchungenAuftrag.CurrentItem.Id);
}