Chciałbym coś takiegoNajkrótsza kod do obliczania wybranych Min/max w .NET
int minIndex = list.FindMin(delegate (MyClass a, MyClass b) {returns a.CompareTo(b);});
Czy istnieje wbudowane sposób to zrobić w .NET?
Chciałbym coś takiegoNajkrótsza kod do obliczania wybranych Min/max w .NET
int minIndex = list.FindMin(delegate (MyClass a, MyClass b) {returns a.CompareTo(b);});
Czy istnieje wbudowane sposób to zrobić w .NET?
spróbuj poszukać w tych:
Dopóki klasa implementuje IComparable, wszystko co musisz zrobić, to:
List<MyClass> list = new List();
//add whatever you need to add
MyClass min = list.Min();
MyClass max = list.Max();
użyciu LINQ masz Funkcje Min() i Max().
Więc można zrobić list.AsQueryable().Min();
Niewielkie: nie ma potrzeby AsQueryable() tutaj ... –
Nie wiedziałem, że lista <> ma funkcje Min i Max. Każdego dnia uczysz się czegoś nowego! :-) –
pamiętać, że „nadal jestem w 2” - Państwo może więc warto spojrzeć na LINQBridge. To jest rzeczywiście na celu C# 3.0 i .NET 2.0, ale powinieneś być w stanie go używać z C# 2.0 i .NET 2.0 - po prostu będziesz musiał użyć długiej ręki:
MyClass min = Enumerable.Min(list),
max = Enumerable.Max(list);
oczywiście będzie łatwiej, jeśli przełączysz się na C# 3.0 (nadal celując w .NET 2.0).
A jeśli LINQBridge nie jest opcją, można go realizować siebie:
static void Main()
{
int[] data = { 3, 5, 1, 5, 5 };
int min = Min(data);
}
static T Min<T>(IEnumerable<T> values)
{
return Min<T>(values, Comparer<T>.Default);
}
static T Min<T>(IEnumerable<T> values, IComparer<T> comparer)
{
bool first = true;
T result = default(T);
foreach(T value in values) {
if(first)
{
result = value;
first = false;
}
else
{
if(comparer.Compare(result, value) > 0)
{
result = value;
}
}
}
return result;
}
Skończyło się na implementacji - uważam, że mój kod jest DOKŁADNIE podobny do twojego fragmentu. Czy wziąłeś to z mojej kontroli źródła? :) – ripper234
Cóż, jeśli nie można użyć .NET 3.5, zawsze można posortować listę, a następnie powrócić listy [0 ]. Może nie jest to najszybszy sposób, ale prawdopodobnie jest to najkrótszy kod, szczególnie jeśli twoja klasa już implementuje IComparable.
List<SomeClass> list = new List<SomeClass>();
// populate the list
// assume that SomeClass implements IComparable
list.Sort();
return list[0]; // min, or
return list[list.Count - 1]; // max
ta zakłada także, oczywiście, że to nie ma znaczenia, który element wrócisz, jeśli masz wiele przedmiotów, które są minimalne lub maksymalne.
Jeśli klasa nie implementuje IComparable, można przekazać w anonimowej delegata, coś takiego:
list.Sort(delegate(SomeClass x, SomeClass y) { return string.Compare(x.Name, y.Name); });
Zgadzam się, podoba mi się ... szczególnie biorąc pod uwagę fakt, że jest w 2.0. Rewizja! – Ken
Krótki kod nie jest metryka dla mnie. Twórz kod tak czytelny i czytelny, jak to możliwe. Nie płacisz za linię;). – Tigraine