在列表的列表中查找一个元素,c#
我的清单如下:在列表的列表中查找一个元素,c#,c#,C#,我的清单如下: List用户列表 Class T{string uniqueidentifier,string param2,int param2} 我有一个uniqueidentifier,我需要在列表中找到具有相同“uniqueidentifier”值的元素T 我可以使用两个“foreach”循环来完成。这似乎不是一种好的做事方式。我想应该有一些内置的方法,比如“Find”,它做同样的事情,并且是高度优化的 Find根本没有优化——它执行线性搜索,因为这是在未排序的列表中唯一有意义的事情。如
List用户列表
Class T{string uniqueidentifier,string param2,int param2}
我有一个uniqueidentifier,我需要在列表中找到具有相同“uniqueidentifier”值的元素T
我可以使用两个“foreach”循环来完成。这似乎不是一种好的做事方式。我想应该有一些内置的方法,比如“Find”,它做同样的事情,并且是高度优化的
Find
根本没有优化——它执行线性搜索,因为这是在未排序的列表中唯一有意义的事情。如果您正在寻找一种更好的编写方法,可以使用LINQ:
var element = (from sublist in userList
from item in sublist
where item.uniqueidentifier == someid
select item).FirstOrDefault();
如果这行得通,就不是100%
var match = userList.Where(x=> x.Any(y=>y.uniqueidentifier = "blah"));
如果没有索引/散列,“高度优化”的查找将无济于事。最好的选择是更改数据的存储方法,例如树 如果您使用的是多核系统,请在不更改存储机制的情况下并行搜索 试试这个:
var query =
from ts in userList
from t in ts
where t.uniqueidentifier == uniqueidentifier
select t;
var user = query.FirstOrDefault();
我建议您将外部列表更改为a,然后您可以找到具有唯一标识符的内部列表
Dictionary<string, List<T>> myDictionary = new Dictionary<string,List<T>>();
myDictionary["1"] = innerList;
List<T> list = myDictionary["1"]; //find list with unique id "1"
Dictionary myDictionary=newdictionary();
myDictionary[“1”]=内部列表;
列表=myDictionary[“1”]//查找唯一id为“1”的列表
这将找到包含具有该标识符的项目的内部列表;它找不到项目本身。@cdhowie,是的,你是对的,可以很容易地找到它,但这需要再次搜索列表,这将是低效的,肯定不是一个好的解决方案!这就是为什么要使用选择many
。查看我的答案——编译后的代码将使用SelectMany
将嵌套列表结构展平为一长串元素。@cdhowie:啊,谢谢,虽然我写了很多类似于您答案中的查询,但我不知道它的lamdba表单。太酷了。精彩的。我真的很惊讶Linq的力量。你能告诉我一些好的LINQ资源吗?是的,我必须尝试一种不同的存储方法。但我确实发现了cdhowie的答案,使用LINQ非常有用。这似乎相当快,但我还没有真正尝试过大型列表。将数据存储更改为tree会比LINQ更快吗?在这种情况下,LINQ不会有什么神奇之处,也不会做任何不同的事情。它唯一能做的就是延迟结果的使用,或者换句话说,延迟加载结果直到使用它。cdhowie非常小心地说“编写它的更好方式”而不是“执行更快的搜索”。唯一标识符是项目的,而不是内部列表的。这意味着内部列表具有多个唯一标识符。尽可能多的项目包含简洁明了的想法;)