计算List <List <T >>中的元素数

kas*_*rhj 21 c# linq

我有一个List<List<T>>.如何List<T>以最快的方式计算其中的所有元素?

到目前为止我已经习惯了

List<int> result = listOfLists
  .SelectMany(list => list)
  .Distinct()
  .ToList().Count;
Run Code Online (Sandbox Code Playgroud)

但这实际上会创建一个列表,然后计算一个不是一个好主意的元素.

Hom*_*mam 16

通过使用LINQ,我认为您的代码很好,有一些不需要的更改.ToList(),只需调用Count()扩展如下:

int result = listOfLists.SelectMany(list => list).Distinct().Count();
Run Code Online (Sandbox Code Playgroud)


tva*_*son 14

如果你需要消除列表之间的重复,我会推荐一个带有HashSet的简单嵌套循环.它将SelectMany和Distinct操作组合到集合插入逻辑中,并且应该更快,因为HashSet具有O(1)查找时间.内部Distinct()实际上可能使用类似的东西,但这完全省略了单个列表的构造.

var set = new HashSet<T>();
foreach (var list in listOfLists)
{
    foreach (var item in list)
    {
        set.Add(item);
    }
}
var result = set.Count;
Run Code Online (Sandbox Code Playgroud)


小智 9

要计算列表中所有列表中的所有元素,可以使用聚合运算符:

int count = listOfLists.Sum(l => l.Distinct().Count());
Run Code Online (Sandbox Code Playgroud)

  • 这不会消除列表之间的重复,仅在每个列表中. (2认同)
  • @lejon为什么你接受一个与原始代码不同的答案?tvanfosson和Homam的答案是正确的. (2认同)