linq查询下面给出了nd中相同项目的两个条目。寻找一种方法来删除反向条目。
//unit = new List<string>{"F1","F2","F3","F4","F5","F6","F7","F8","F9"}
//v["F3"]="12" v["F6"]="12"
var nd = (from n1 in unit
from n2 in unit
where n1 != n2 && v[n1].Length == 2 && v[n1] == v[n2]
select new {n1,n2}).ToList();
nd中的值如下所示。我怎么能避免第二次进入?
Count = 2
[0]: { n1 = "F3", n2 = "F6" }
[1]: { n1 = "F6", n2 = "F3" }
答案 0 :(得分:1)
解决方案非常简单。而不是检查两个条目是否不同,检查一个是否严格大于另一个:
var nd = (from n1 in unit
from n2 in unit
where n1 > n2 && v[n1].Length == 2 && v[n1] == v[n2]
select new {n1,n2}).ToList();
答案 1 :(得分:0)
您可以选择(n1,n2,min(n1,n2),max(n1,n2)),按最小值和最大值分组,然后选择每组中的第一个。
var result = nd.GroupBy(item =&gt; new {item.min,item.max})。选择(grp =&gt; new {grp.First()。n1,grp.First()。n2} );
答案 2 :(得分:-1)
您可以比较一个是否小于或大于另一个而不是仅检查不等式。这个技巧在SQL中是众所周知的,例如:1,2。
在.NET LINQ实现中,您可以使用String.CompareOrdinal()
方法,因为比较字符串与使用<
或>
运算符一样简单:
var nd = (from n1 in unit
from n2 in unit
where String.CompareOrdinal(n1,n2) < 0 && v[n1].Length == 2 && v[n1] == v[n2]
select new { n1, n2 }).ToList();