簡體   English   中英

什么是Python的min / max的C#等價

[英]What's the C# equivalence of Python's min/max

什么是C#的以下Python的最小/最大代碼的等價:

pairs = [ (2,"dog"), (1, "cat"), (3, "dragon"), (1, "tiger") ]

# Returns the PAIR (not the number) that minimizes on pair[0]
min_pair = min(pairs, key=lambda pair:pair[0])

# this will return (1, 'cat'), NOT 1

似乎C#的Enumerable.Min非常接近。 但根據其MSDN文檔 ,它總是返回最小化VALUE(不是原始對象)。 我錯過了什么嗎?

編輯


請注意 - 由於排序(O(nlogn))在計算上比找到最小值(O(n))更重,所以我不傾向於首先進行排序。

請注意 - 字典也不是理想的方法。 它不能處理有重復鍵的情況 - (1,“cat”)和(1,“tiger”)。

更重要的是,字典無法處理要處理的項目是復雜類的情況。 例如,使用年齡作為關鍵,找到動物對象列表的最小值:

class Animal
{
  public string name;
  public int age;
}

BCL沒有MinBy功能,但很容易自己編寫一個。

public static T MinBy<T, C>(this IEnumerable<T> items, Func<T, C> projection) where C : IComparable<C> {
    return items.Aggregate((acc, e) => projection(acc).CompareTo(projection(e)) <= 0 ? acc : e);
}

您可以選擇編寫比我更復雜的MinBy,以避免重新評估投影。 無論如何,一旦你擁有MinBy功能,你就可以輕松解決問題:

var pairs = new[] {Tuple.Create(2,"dog"), Tuple.Create(1, "cat"), Tuple.Create(3, "dragon"), Tuple.Create(1, "tiger")};
var min_pair = pairs.MinBy(e => e.Item1);

編輯

var minage = collection.Min( x => x.Age ); //for maxage replace Min by Max
var minAgeAnimals = collection.where(x=> x.age == minage); 
foreach(Animal animal in minAgeAnimals )
   Console.Writeline (  animal.Age.ToString() + " : " + animal.Name); 

上一頁。 在編輯問題之前回答

在C#中使用dictonary對象,而不是做這樣的事情你想做同樣的事情

int minimumKey = touchDictionary.Keys.Min(); 
string value = "";
touchDictionary.TryGetValue(minimumKey, out value))
Console.Writeline ( "min key pair is:-" + minimumKey.ToString() + " : " + value); 

要么

在linq的幫助下,它變得簡單易用

var dictionary = new Dictionary<int, string>  
                     {{1, "one"}, {2, "two"}, {3, "three"}, {4, "four"}  };  

        var maxKey = dictionary.Max(x => x.Key);  
        var minkey = dictionary.Min(x => x.Key);  

采用

Dictionary<int, string> pairs = new Dictionary<int, string>()
                          { {2,"dog"}, {1, "cat"}, {3, "dragon"} };

var min = pairs.OrderBy(x => x.Key).FirstOrDefault();

要么

int min = pairs.Keys.Min();

Dictionary<int, string> result 
                          = new Dictionary<int, string>() { {min, pairs[min]} };

我會用

var min = pairs.OrderBy(x => x.FirstValue).FirstOrDefault();

雖然我同意排序比找到最小值更重,但請注意,這不是整個集合的排序。 它正在查找集合中有序枚舉中的第一個(或默認)項目 - 這是懶惰地迭代。

如果你有

var min = pairs.OrderBy(x => x.FirstValue).ToList().FirstOrDefault();

然后我同意 - 你正在整理你的對,然后拿第一個。 但LINQ比這更聰明,你不會對集合進行排序。 您將從可能訂購但尚未執行的集合中獲取第一個。


除了你關於Dictionary無法使用復雜集合的觀點 - 比如Animal列表 - 你會如何按Animal排序? 您永遠不能按復雜對象排序。 相反,您需要使用動物的年齡作為關鍵。 字典可以很容易地做到這一點 - 事實上,字典的鍵永遠不會與字典的值相同,否則會有什么意義呢?

var animals = new List<Animal>();
// get some animals...

var animalictionary = animals.ToDictionary(a => a.Age);
// assuming the animals have distinct ages, else

var animalLookup = animals.ToLookup(a => a.Age);

foreach (var animalGroup in animalLookup)
{
    var age = animalGroup.Key;
    Console.WriteLine("All these animals are " + age);
    foreach (Animal animal in animalGroup)
    {
        Console.WriteLine(animal.name);
    }
} 

暫無
暫無

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

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