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非常接近。但是根据its MSDN doc,它总是返回最小化的VALUE(不是原始对象)。我错过了什么吗?
修改
请注意 - 我不倾向于首先排序,因为排序(O(nlogn))在计算上比找到最小值(O(n))重。 / p>
请注意 - 字典也不是理想的方法。它无法处理存在重复键的情况 - (1," cat")和(1," tiger")。
更重要的是,字典无法处理要处理的项目是复杂类的情况。例如,使用年龄作为关键,找到动物对象列表的最小值:
class Animal
{
public string name;
public int age;
}
答案 0 :(得分:3)
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);
答案 1 :(得分:0)
修改强>
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);
答案 2 :(得分:0)
使用
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]} };
答案 3 :(得分:0)
我会用
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);
}
}