Linq查找下面发生了什么

时间:2019-05-15 21:42:38

标签: c# linq

我对LINQ的经验非常有限,想了解这段代码如何获取价值。由于alternateId = Names.ElementAt(n).,它是在整个列表中进行搜索还是在列表中命中了确切的记录?在SQL中,这对我来说似乎是“ Where子句”。但这可能有所不同。

如果发生这种情况,只是想了解全列表搜索的费用

MapList.Find(x => x.AlternateId == Names.ElementAt(n).ToString()).MyColumValue;

3 个答案:

答案 0 :(得分:5)

Find(Predicate<T>) 不是LINQ的一部分,但它是通用集合类型List<T>的一种方法。根据{{​​3}},它执行线性搜索,直到找到与谓词匹配的第一个元素。

  

此方法执行线性搜索;因此,这种方法是   O(n)运算,其中n是Count。


取决于Names.ElementAt(n)的类型,LINQ方法Names是O(1)或O(n)。如果正在实现IList<T>(因此支持随机访问),则为O(1)。其他ElementAt枚举Names直到返回第n th 元素。

答案 1 :(得分:1)

首先,将MapList中的数据初始化为x,然后查找与Names.ElementAt(n)具有相同值的AlternateID,然后将结果作为字符串返回。

答案 2 :(得分:1)

呼叫Names.ElementAt(n)会找到确切的记录,因为它正在被索引查找。

呼叫MapList.Find(x => x.AlternateId = ...将搜索整个列表,然后返回第一个匹配项。

我认为,如果您将代码修改为硬编码的内容(只是为了了解其工作原理),答案将会更加清晰。将Names.ElementAt(n).ToString()修改为其他值(可能是“ 4”)

所以

MapList.Find(x => x.AlternateId == Names.ElementAt(n).ToString()).MyColumValue;

成为

MapList.Find(x => x.AlternateId == "4").MyColumValue;