42

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

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

我怎样才能访问,list[i].Title而不必遍历我的整个集合?由于我的列表趋于变大,这可能会影响我的程序的性能。

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

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

4

10 回答 10

63

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

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

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

值得一提的是,没有跳过迭代,而是简单地包装到 LINQ 查询中。

希望这可以帮助。

编辑

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

于 2012-05-08T12:13:29.233 回答
40

Linq来了:

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

如果没有与谓词匹配的项目,它将引发异常。或者,有SingleOrDefault.

如果您想要与标题匹配的项目集合,则有:

var listItems = list.Where(i => i.Title ==  title);
于 2012-05-08T12:15:57.313 回答
7

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

using System.Linq;

采用

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

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

于 2013-12-26T16:14:24.507 回答
5

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

var myObjects = new Hashtable();
myObjects.Add(yourObject.Title, yourObject);
...
var myRetrievedObject = myObjects["TargetTitle"];
于 2012-05-08T12:18:51.077 回答
4

考虑创建索引。字典可以解决问题。如果您需要列表语义,子类化并将索引保​​留为私有成员......

于 2012-05-08T12:17:29.377 回答
2

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

于 2012-05-08T12:16:58.927 回答
2

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

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

于 2012-05-08T12:17:18.620 回答
0

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

于 2012-05-08T12:18:59.543 回答
-1

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

int result = obsCollection.IndexOf(title);

IndexOf(T)
搜索指定对象并返回整个 Collection 中第一次出现的从零开始的索引。

(继承自收藏)

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

于 2018-09-29T14:28:09.787 回答
-2

一个 observablecollection 可以是一个 List

{
    BuchungsSatz item = BuchungsListe.ToList.Find(x => x.BuchungsAuftragId == DGBuchungenAuftrag.CurrentItem.Id);
}
于 2019-11-11T11:34:05.097 回答