En C #, je voudrais trier un List<KeyValuePair<int, string>>
par la longueur de chaque chaîne de la liste. Dans Psuedo-Java, ce serait un anonyme et ressemblerait à quelque chose comme:
Collections.Sort(someList, new Comparator<KeyValuePair<int, string>>( {
public int compare(KeyValuePair<int, string> s1, KeyValuePair<int, string> s2)
{
return (s1.Value.Length > s2.Value.Length) ? 1 : 0; //specify my sorting criteria here
}
});
L'équivalent en C # serait d'utiliser une expression lambda et la méthode Sort
:
someList.Sort((x, y) => x.Value.Length.CompareTo(y.Value.Length));
Vous pouvez également utiliser la méthode d'extension OrderBy
. C'est un peu moins de code, mais cela ajoute plus de surcharge car il crée une copie de la liste au lieu de la trier en place:
someList = someList.OrderBy(x => x.Value.Length).ToList();
Vous pouvez utiliser linq appelant OrderBy
list.OrderBy(o => o.Value.Length);
Pour plus d'informations sur ce que @Guffa a souligné, recherchez Linq et exécution différée , en gros, il ne s'exécutera qu'en cas de besoin. Donc, pour retourner immédiatement une liste à partir de cette ligne, vous devez ajouter une .ToList()
qui fera que l'expression à exécuter retournera une liste.
tu peux utiliser ça
using System;
using System.Collections.Generic;
class Program
{
static int Compare1(KeyValuePair<string, int> a, KeyValuePair<string, int> b)
{
return a.Key.CompareTo(b.Key);
}
static int Compare2(KeyValuePair<string, int> a, KeyValuePair<string, int> b)
{
return a.Value.CompareTo(b.Value);
}
static void Main()
{
var list = new List<KeyValuePair<string, int>>();
list.Add(new KeyValuePair<string, int>("Perl", 7));
list.Add(new KeyValuePair<string, int>("Net", 9));
list.Add(new KeyValuePair<string, int>("Dot", 8));
// Use Compare1 as comparison delegate.
list.Sort(Compare1);
foreach (var pair in list)
{
Console.WriteLine(pair);
}
Console.WriteLine();
// Use Compare2 as comparison delegate.
list.Sort(Compare2);
foreach (var pair in list)
{
Console.WriteLine(pair);
}
}
}