19

List<KeyValuePair<int, string>>C#では、リスト内の各文字列の長さで並べ替えたいと思います。Psuedo-Javaでは、これは匿名であり、次のようになります。

  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. 上記の機能を取得するにはどうすればよいですか?
4

3 に答える 3

38

C#での同等の機能は、ラムダ式とSortメソッドを使用することです。

someList.Sort((x, y) => x.Value.Length.CompareTo(y.Value.Length));

OrderBy拡張メソッドを使用することもできます。コードは少し少なくなりますが、リストを適切に並べ替えるのではなく、リストのコピーを作成するため、オーバーヘッドが増えます。

someList = someList.OrderBy(x => x.Value.Length).ToList();
于 2013-01-27T06:18:23.627 に答える
12

OrderByを呼び出すlinqを使用できます

list.OrderBy(o => o.Value.Length);

@Guffaが指摘したLinqとDeferredExecutionの詳細については、基本的に必要な場合にのみ実行されます。したがって、この行からリストをすぐに返すには、実行する式がリストを返すようにするを追加する必要があり.ToList()ます。

于 2013-01-27T06:15:07.947 に答える
4

あなたはこれを使うことができます

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);
    }
    }
}
于 2013-01-27T06:20:46.303 に答える