Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在列表的列表中查找一个元素,c#_C# - Fatal编程技术网

在列表的列表中查找一个元素,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非常小心地说“编写它的更好方式”而不是“执行更快的搜索”。唯一标识符是项目的,而不是内部列表的。这意味着内部列表具有多个唯一标识符。尽可能多的项目包含简洁明了的想法;)