2011-05-10 58 views
0

我有一個內部版本列表層次Max在LAMBDA或LINQ

List<int[]> BuildVersions; 

我如何才能找到最後一個內部版本。

Build版本,如

100.1.2.3 
101.12.3.2 
101.12.3.3 

更新:表達式必須先檢查一下號碼,然後第二個,然後第三個,然後最後一個

+0

請澄清你的問題。目前很難確定你的意思。 – 2011-05-10 11:03:46

+0

你是什麼意思下「最後版本」。什麼結構「版本」有?提供一些樣品數據 – 2011-05-10 11:06:47

回答

5
int[] maxVersion = buildVersions.OrderByDescending(v => v[0]) 
           .ThenByDescending(v => v[1]) 
           .ThenByDescending(v => v[2]) 
           .FirstOrDefault(); 

或更通用的解決方案是爲下

T[] HierarchicalMax<T>(IEnumerable<T[]> items) 
     { 
      var length = items.Min(v => v.Length); 
      IEnumerable<T[]> result = items; 

      for (int i = 0; i < length; i++) 
      { 
       int offset = i; 
       result = result.OrderByDescending(v => v[offset]); 
      } 

      T[] max = result.FirstOrDefault(); 

      return max; 
     } 
+0

就是這樣。大兄弟。第二個真是太棒了。謝謝 – Saleh 2011-05-10 11:44:14

+0

爲什麼不直接執行'for(int offset = 0; offset ICR 2011-05-10 19:03:43

+0

如果您有不同長度的版本,則這不起作用。例如[2.1.1,2.1.2,1.2]可能會選擇2.1.1。 – ICR 2011-05-10 19:10:49

-1

你有int數組列表?

如果沒有,

int maxValue=BuildVersions.Max(); 
+0

大聲笑******************************************** *** – Saleh 2011-05-10 11:09:32

+0

他有一個int數組的列表,它是什麼(只是因爲答案不起作用)-1 – Dani 2011-05-10 11:51:20

0

如果我理解正確的話,你有一個int數組列表,並且要確定在那裏的地方最高INT。

這將是這樣的:

var max = BuildVersions.Max(x => x.Max(y => y)); 
+0

我認爲這是我想要的,但我必須測試它... – Saleh 2011-05-10 11:11:23

+0

不,也許它不是表達式必須檢查第一個數字,然後第二個,然後第三個,然後是最後一個。 – Saleh 2011-05-10 11:15:21

+0

這就是這樣做的。它將最大值從列表中取出,這些值已經是數組的最大值。 – 2011-05-10 11:32:10

0

有點效率低下,因爲它發現當前設置的最小長度每次過濾版本。這可以在代碼複雜化的額外成本下進行空間交易。它假定1.1大於1.1.1。

for (int versionPart = 0; versionPart < versions.Min(v => v.Length); versionPart += 1) { 
    versions = versions.MaxValues(version => version[versionPart]); 
} 
var maxVersion = versions.FirstOrDefault(); 

隨着擴展方法:

public static IEnumerable<T> MaxItems<T>(this IEnumerable<T> list, Func<T, int> selector) { 
    var enumerator = list.GetEnumerator(); 

    if (!enumerator.MoveNext()) { 
     return Enumerable.Empty<T>(); 
    } 

    var maxItem = enumerator.Current; 
    List<T> maxItems = new List<T>() { maxItem }; 
    int maxValue = selector(maxItem); 

    while (enumerator.MoveNext()) { 
     var item = enumerator.Current; 
     var value = selector(item); 

     if (value > maxValue) { 
      maxValue = value; 
      maxItems = new List<T>() { item }; 
     } else if (value == maxValue) { 
      maxItems.Add(item); 
     } 
    } 

    return maxItems; 
}