【问题标题】:C# Linq Query to avoid reversed entriesC# Linq Query 以避免反向条目
【发布时间】:2015-08-21 03:12:22
【问题描述】:

下面的 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" }

【问题讨论】:

    标签: linq


    【解决方案1】:

    您可以选择 (n1, n2, min(n1, n2), max(n1, n2)),按最小值和最大值分组,然后选择每组中的第一个。

    var 结果 = nd.GroupBy(item => new {item.min, item.max}).Select(grp => new {grp.First().n1, grp.First().n2});

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        您可以比较一个小于或大于另一个,而不仅仅是检查不等式。这个技巧在 SQL 中是众所周知的,例如:12

        在 .NET LINQ 实现中,您可以使用 String.CompareOrdinal() 方法,因为比较字符串不像使用 &lt;&gt; 运算符那么简单:

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

        【讨论】:

        • 嗯.. 想解释为什么投反对票?我在这里错过了什么?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-26
        • 2016-06-08
        • 2016-11-11
        • 2013-02-01
        相关资源
        最近更新 更多