"Flatten"将<Tuple << T>,<T >>>列入List <T>

And*_*rew 0 c# linq performance

我有一个元组列表,元组中的对象都是相同的类型.在我们进行错误处理之前,需要一个元组列表的数据结构.为了优化错误处理,我想将元组展平为单个列表以允许重复检查:

例如,如果我有List<Tuple<string,string>>()(我的类型更复杂但想法应该成立):

[<"Tom","Dick">, <"Dick","Harry">, <"Bob","John">]

我想最终得到:

["Tom", "Dick", "Harry", "Bob", "John"]

我知道我可以这样做:

List<string> stringList = List<string>();
Foreach(var item in tupleList){
  stringList.Add(item.Item1);
  stringList.Add(item.Item2);
}
stringList = stringList.Distinct();
Run Code Online (Sandbox Code Playgroud)

但我希望有一种更有效的方式,也许是Linq内置的东西.不能保证重复,但由于错误处理的性能成本,我宁愿只处理一次.

Ale*_*kov 5

如果您需要不同订单的不同商品 - 请使用HashSet:

HashSet<string> stringList = new HashSet<string>();
foreach(var item in tupleList){
  stringList.Add(item.Item1);
  stringList.Add(item.Item2);
}
Run Code Online (Sandbox Code Playgroud)

您可以使用LINQ执行类似的代码,但它不会更快(并且可能不会更好看,因为您需要在Tuple大多数操作中转换为可枚举).Aggregate如果你真的在寻找LINQ,你可以试试.

  • @Andrew确实如此.而你投票并且后来被作者删除的问题告诉你如何 - 使用`SelectMany`.`stringList.SelectMany(t => new [] {t.Item1,t.Item2})`返回`IEnumerable <string>`这意味着你可以调用`Distinct`并获得你想要的东西. (6认同)