C#Linq查询以避免反向输入

时间:2015-06-06 04:22:31

标签: linq

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" }

3 个答案:

答案 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中是众所周知的,例如:12

在.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();