我有一个元组列表,元组中的对象都是相同的类型。在我们进行错误处理之前,需要一个元组列表的数据结构。为了优化错误处理,我想将元组展平为一个列表以允许重复检查:
例如,如果我有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内置的东西。不能保证重复,但由于错误处理的性能成本,我宁愿只处理一次。
答案 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();
一行,但仍然不是一行中的俄罗斯方块Ж)