&#34;平铺&#34;列表<元组<< T>,<T>&GT;&GT;进入List <t>

时间:2018-02-16 22:26:15

标签: c# performance linq

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

例如,如果我有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();

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

3 个答案:

答案 0 :(得分:5)

如果您需要不订购的不同商品,请使用HashSet

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

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

答案 1 :(得分:2)

作为上述内容的略微变化,你也可以这样做:

HashSet<string> hash= new HashSet<string>();
tupleList.ForEach(l => hash.UnionWith(new string[] { l.Item1, l.Item2 }));

虽然我喜欢问题评论中的SelectMany示例

答案 2 :(得分:1)

使用linq SelectMany方法

很简单
var tupleList = Enumerable.Range(0, 10).Select(i => new Tuple<string, string>(i.ToString(), "just for example")); // tuples
var trg = tupleList.SelectMany(t => new[] { t.Item1, t.Item2 }).Distinct();

一行,但仍然不是一行中的俄罗斯方块Ж)