我有一個內部版本列表層次Max在LAMBDA或LINQ
List<int[]> BuildVersions;
我如何才能找到最後一個內部版本。
Build版本,如
100.1.2.3
101.12.3.2
101.12.3.3
更新:表達式必須先檢查一下號碼,然後第二個,然後第三個,然後最後一個
我有一個內部版本列表層次Max在LAMBDA或LINQ
List<int[]> BuildVersions;
我如何才能找到最後一個內部版本。
Build版本,如
100.1.2.3
101.12.3.2
101.12.3.3
更新:表達式必須先檢查一下號碼,然後第二個,然後第三個,然後最後一個
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;
}
有點效率低下,因爲它發現當前設置的最小長度每次過濾版本。這可以在代碼複雜化的額外成本下進行空間交易。它假定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;
}
請澄清你的問題。目前很難確定你的意思。 – 2011-05-10 11:03:46
你是什麼意思下「最後版本」。什麼結構「版本」有?提供一些樣品數據 – 2011-05-10 11:06:47