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以获得更简洁明了的语法.
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)
我建议将它们存储在哈希表中。然后,您可以使用键访问集合中的项目,这是一种更有效的查找。
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)
这将告诉您任何变量是否满足您的给定条件.