c# Linq查询避免反向条目

  • 本文关键字:Linq 查询 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" }

解决方案非常简单。不是检查两个条目是否不同,而是检查其中一个是否严格大于另一个:

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

相关内容

  • 没有找到相关文章