Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# &引用;“展平”;列表<;元组<&书信电报;T>&书信电报;T>&燃气轮机&燃气轮机;进入列表<;T>;_C#_Performance_Linq - Fatal编程技术网

C# &引用;“展平”;列表<;元组<&书信电报;T>&书信电报;T>&燃气轮机&燃气轮机;进入列表<;T>;

C# &引用;“展平”;列表<;元组<&书信电报;T>&书信电报;T>&燃气轮机&燃气轮机;进入列表<;T>;,c#,performance,linq,C#,Performance,Linq,我有一个元组列表,元组中的对象都是相同类型的。在进行错误处理之前,需要元组列表的数据结构。为了优化错误处理,我想将元组扁平化为一个列表,以允许重复检查: 例如,如果我有List()(我的类型更复杂,但这个想法应该成立): [,] 最后,我想说: [“汤姆”、“迪克”、“哈利”、“鲍勃”、“约翰”] 我知道我可以这样做: List<string> stringList = List<string>(); Foreach(var item in tupleList){ s

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

例如,如果我有
List()
(我的类型更复杂,但这个想法应该成立):

[,]

最后,我想说:

[“汤姆”、“迪克”、“哈利”、“鲍勃”、“约翰”]

我知道我可以这样做:

List<string> stringList = List<string>();
Foreach(var item in tupleList){
  stringList.Add(item.Item1);
  stringList.Add(item.Item2);
}
stringList = stringList.Distinct();
List-stringList=List();
Foreach(元组列表中的变量项){
stringList.Add(项目1);
stringList.Add(项目2);
}
stringList=stringList.Distinct();

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

如果您需要不同的项目而不需要订购,请使用:

HashSet-stringList=new HashSet();
foreach(元组列表中的变量项){
stringList.Add(项目1);
stringList.Add(项目2);
}

您可以使用LINQ编写类似的代码,但速度不会更快(而且可能不会更好,因为对于大多数操作,您需要将
Tuple
转换为enumerable)。如果您真的在寻找LINQ,您可以尝试
Aggregate

作为上面的一个细微变化,您也可以这样做:

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

虽然我喜欢问题注释中的
SelectMany
示例

但是使用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();
var-tupleList=Enumerable.Range(0,10)。选择(i=>newtuple(i.ToString(),“仅作为示例”);//元组
var trg=tupleList.SelectMany(t=>new[]{t.Item1,t.Item2}).Distinct();

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

你所拥有的没有什么错。我会选择使用一个
HashSet
,这样我就可以摆脱
Distinct()
调用。你可以用Linq做这个,但这并不意味着它更好:
tupleList.SelectMany(t=>newstring[]{t.Item1,t.Item2})。Distinct().ToList()
成为Linq并不重要,Linq只是在系统中常用,如果更好的话也可以使用。Linq能处理多少可枚举数,我希望它能找到一种平坦化的方法。顺序不重要,结果将再次迭代。这是我能想到的最好的方法。您可以通过几种方式使用LINQ,但它的可读性要差得多,而且可能没有它的效率高。你投了否决票,后来被作者删除的问题向你展示了如何使用
SelectMany
stringList.SelectMany(t=>new[]{t.Item1,t.Item2})
返回
IEnumerable
,这意味着您可以调用
Distinct
并获取所需内容。我投票取消删除显示
SelectMany
的答案,但我不确定为什么两个答案都被否决——尽管我认为创建许多数组不是“有效”的方法,但绝对是可靠的林克方式。(再加上@Andrew对删除的问题的评论是错误的-可能解释了为什么一个被否决了…)SelectMany和UnionWith的问题是他们都为每个元组创建了一个数组,我认为这可能比迭代的性能更差。\@Andrew你是对的,但是这些数组是在堆栈上创建的,而不是在堆上创建的,所以它们不会被GC破坏,而是作为一个函数返回,它会被CLR优化。通过使用它,您可以在一行中获得简单的并行处理方法-tupleList.AsParallel().SelectMany(t=>new[]{t.Item1,t.Item2}).Distinct().ToArray();
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();