0

私は多くのエンティティを持っており、特定のオブジェクトとプロパティで並べ替えられたリストを提供できる汎用並べ替えクラスを作成したいと考えています。例えば

Class Country
{
      public int id { get; set; }
      public string CountryName { get; set; }
}

これで、並べ替え対象のプロパティ名と共に、並べ替えられていないリストをソーター クラスに渡すことができるはずです。私は今までかなり長い間自分自身を打ち負かしてきましたが、今は立ち往生しています。どんな助けでも大歓迎です。

4

4 に答える 4

1

LINQプロパティ名による並べ替えは、.NET拡張メソッド、より具体的には動的LINQセクションを使用して簡単に実行できます。すべてがどのように機能するかについては、ScottGuによって作成されたDynamicLINQ(パート1:LINQ動的クエリライブラリの使用)をご覧ください。基本的に、ソータークラスOrderByは、LINQ拡張機能との豪華なラッパーである必要はありませんOrderByDescending

次に例を示します。

var sortedCountries = listOfCountries.OrderBy("CountryName");

または、ジェネリックスに精通している場合は、コレクションを受け入れるラッパーを作成し、次のFunc<TSource, TKey>ようにプロパティ値を選択するために使用できます。

public class MySorterClass
{
    public IEnumerable<TSource> OrderList<TSource, TKey>(IEnumerable<TSource> list, Func<TSource, TKey> selector)
    {
        return list.OrderBy(selector);
    }

    public IEnumerable<TSource> OrderList<TSource>(IEnumerable<TSource> list, string propertyName)
    {
        return list.OrderBy(propertyName);
    }
}
于 2012-08-27T19:43:34.183 に答える
0

最後に、一般的なソーターを実装し、それを拡張メソッドとして作成して、List を使用する場所ならどこでも使用できるようにしました。以下は私の実装です。sortorder は Asc/Desc であり、propertyname はタイプ T のプロパティの名前です。これはうまく機能し、これに満足しています。

public static List<T> SortedListWithLamda<T>(this List<T> list, string sortorder, string propertyname)
        {
            List<T> sortedlist = new List<T>();
            if (!string.IsNullOrEmpty(propertyname) && list != null && list.Count > 0)
            {

                Type t = list[0].GetType();

                if (sortorder == "A")
                {

                    sortedlist = list.OrderBy(
                        a => t.InvokeMember(
                            propertyname
                            , BindingFlags.GetProperty
                            , null
                            , a
                            , null
                        )
                    ).ToList();
                }
                else
                {
                    sortedlist = list.OrderByDescending(
                        a => t.InvokeMember(
                            propertyname
                            , BindingFlags.GetProperty
                            , null
                            , a
                            , null
                        )
                    ).ToList();
                }
            }
            return sortedlist;
        }
于 2012-08-28T20:15:33.313 に答える
0

Java を使用している場合は、Collections.Sort(...)をご覧ください。2 つのバージョンがあります。1 つは要素の自然な順序付けを使用して要素を並べ替え ( Compareableを見てください) インターフェイスを使用し、もう 1 つはComparatorを取り込みます。どちらでも動作するはずです。そうでなければ、他の言語にも非常に似たものがあると確信しています。

于 2012-08-27T17:06:11.293 に答える
0

回避策:

あなたは言語について言及していません。ではc#、クラスにインターフェイスIComparableを実装させて関数を追加することができますCompareTo。これは 2 つの引数を取り、どちらが大きいかを返すか、同じことを行う無名関数を使用します。

于 2012-08-27T17:07:31.180 に答える