下面的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" }
解决方案非常简单。不是检查两个条目是否不同,而是检查其中一个是否严格大于另一个:
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();
您可以选择(n1, n2, min(n1, n2), max(n1, n2)),按min和max分组,并在每组中选择第一个。
var result = nd。GroupBy(item => new {item。分钟,item.max})。选择(grp => new {grp. first())。n1, grp.First () .n2});
您可以比较是否一个小于或大于另一个,而不仅仅是检查不相等。这个技巧在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();