2015-06-06 27 views
0

下面的linq查詢給出了nd中相同項目的兩個條目。尋找一種方法來刪除反轉的條目。C#Linq查詢以避免顛倒的條目

//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

你可以選擇(N1,N2,分(N1,N2),MAX(N1,N2)),由最小和最大組,並選擇每個組中的第一個。

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

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

您可以比較,如果一個比另一個,而不是隻檢查不平等小於或更高。這個技巧在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(); 
+0

嗯..你能解釋爲什麼downvote?我在這裏錯過了什麼? – har07