web-dev-qa-db-fra.com

c # Tri d'une liste <KeyValuePair <int, string >>

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
      }
    });
  1. Comment obtenir les fonctionnalités ci-dessus?
16
CodeKingPlusPlus

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();
34
Guffa

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.

11
BrunoLM

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);
    }
    }
}
4
user1968030