簡體   English   中英

從具有最小值的KeyvaluePairs列表獲取KeyValuePair

[英]to get a KeyValuePair from a List of KeyvaluePairs with the minimum value

我需要從List<KeyValuePair<Int, Int>>的列表中獲取Kvp List<KeyValuePair<Int, Int>>具體取決於最小值。

我試過這個:

KeyValuePair<Int, Int> kvp= listOfKvps.Min(e=> e.Key);

但這只返回值,而不是我需要的整個KeyValuePair

var min = listOfKvps.OrderBy(kvp => kvp.Key).First();

如果你想通過序列中的單個O(n)傳遞,而不是要求O(n log n)排序,那么你可以這樣做:

var min = listOfKvps.Aggregate((agg, kvp) => (kvp.Key < agg.Key) ? kvp : agg);

(當然,第二個版本的可讀性/直覺性遠遠低於第一個版本,即使它確實具有更好的理論性能。使用某種MinBy方法更有意義:要么自己編寫,請使用Marc的答案版本使用MoreLINQ中的版本 。)

有沒有內在的MinBy方法,所以你既可以寫一個MinBy擴展方法,或者只是.OrderBy(x => x.Key).First() MinBy將是O(n)因此效率更高 - 但要編寫更多代碼; p

例如,您可以使用:

var kvp= listOfKvps.MinBy(e=> e.Key);

有:

public static class SomeUtil {
    public static TSource MinBy<TSource, TValue>(
        this IEnumerable<TSource> source, Func<TSource, TValue> selector) {
        using (var iter = source.GetEnumerator())
        {
            if (!iter.MoveNext()) throw new InvalidOperationException("no data");
            var comparer = Comparer<TValue>.Default;
            var minItem = iter.Current;
            var minValue = selector(minItem);
            while (iter.MoveNext())
            {
                var item = iter.Current;
                var value = selector(item);
                if (comparer.Compare(minValue, value) > 0)
                {
                    minItem = item;
                    minValue = value;
                }
            }
            return minItem;
        }
    }   
}

我會建議你使用MinBy從擴展法MoreLinq

或者:

var minKey = listOfKvps.Min(kvp => kvp.Key);
var minKvp = listOfKvps.First(kvp => kvp.Key == minKey);

這仍然是O(n) ,雖然它需要2次通過列表。 對列表進行排序然后選擇第一個元素更簡潔,但是O(n * logn) ,這可能與更大的列表相關。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM