0

18 個のプロパティを持つオブジェクト (MyReading と呼ばれる) があります。このオブジェクトのインスタンスをリストに追加します

例えば:

List<MyReading> MyReadingsL = new List<MyReading>();
MyReading O1 = new MyReading();
O1._DateTime = "10";
O1._Value1 = "Hello1";
O1._Value2 = "Hello2";
O1._Value3 = "Hello3";
O1._Value4 = "Hello4";

....etc


MyReadingsL.Add(O1);

18 個のプロパティのいずれかで読み取り値のリストを並べ替える必要があります。(ユーザーがどちらを決定するか) コードで独自の比較ロジックを指定するには、リストの Sort() メソッドのデリゲートを作成する必要があることを理解しています。

例えば。MyReadingsL.Sort(TheDelegate);

問題は、おそらく並べ替えることができるプロパティごとに 18 のデリゲートを書きたくないということです。おそらく、1 つのデリゲート、 (Comparison Delegate) を受け入れる (MyReading x, MyReading y) 、および並べ替え対象のプロパティを示す文字列です。

これはどのように可能ですか?

4

2 に答える 2

3

非常に簡単。Linqはすでにこれを提供しています:

MyReadingsL.OrderBy(r => r._Value1);
MyReadingsL.OrderBy(r => r._Value2);
...
MyReadingsL.OrderBy(r => r._Valuen);
...

同じ方法で呼び出す外部関数を定義する場合、署名は次のようになります。

public IEnumerable<MyReading> GetSortedList(Func<MyReading, string> property) { }

文字列からプロパティに変換するために、静的データ メンバーを定義できます。

public static IDictionary<string, Func<MyReading, string>> Properties = 
    typeof(MyReading).GetProperties().ToDictionary(p => prop.Name, p => new Func<MyReading, string>(r => p.GetValue(r)));

この静的メンバーは、クラス内のすべてのプロパティのディクショナリを提供し、それらを識別する文字列によってキーが付けられ、必要な Linq 操作を実行できるデリゲートへのアクセスを提供します。

次に、sプロパティを識別する文字列を指定するとMyReadingsL.OrderBy(Properties[s])、ほとんどコストをかけずに呼び出すことができます。

于 2013-11-15T11:06:03.760 に答える
1

あなたはlinqによってそれを達成することができます。あなたがしなければならないことは、ソートしたい文字列/プロパティを渡し、orderby.

一般的な例:

// Create 10 objects with 2 properties
var num_and_name_list = 
        from num in Enumerable.Range(1,10)
        select new { val=num, name=(""+num+"oeu")};

// Here i'll sort them by the name property.
var sorted_by_name_list = 
        from some_object in num_and_name_list
        orderby some_object.name descending
        select some_object;

結果は次のようになります

ここに画像の説明を入力

したがって、ソートするプロパティをどのように/どこに渡すかを確認する必要があります。


文字列からプロパティを取得する必要がある場合は、次のようにすることができます。

// Create 10 objects with 3 properties
var num_and_name_list =
        from num in Enumerable.Range(1, 10)
        select  new ExtraStringDataPoint ( num, num*2,  ("" + num + "oeu"));

// Hunting your property starts
Type myType = num_and_name_list.GetType();
IList<PropertyInfo> props = new List<PropertyInfo>(myType.GetProperties());

PropertyInfo order_on_this = null;
foreach (PropertyInfo prop in props)
{
    order_on_this = typeof(ExtraStringDataPoint).GetProperty("Y");
}


// Here i'll sort them by the name property.
var sorted_by_name_list =
        from some_object in num_and_name_list
        orderby order_on_this descending
        select some_object;

ExtraStringDataPointのように見えます:

public class ExtraStringDataPoint : IDataPoint
{
    public ExtraStringDataPoint(double x, double y, string s)
    {
        X = x;
        Y = y;
        Extra = s;
    }
    public double X { get; set; }
    public double Y { get; set; }
    public string Extra { get; set; }

    public override string ToString()
    {
        return X +" , " + Y + " , " + Extra;
    }
}

あなたの場合、「Y」を使用したように、必要な変数を文字列として渡すことができます。

于 2013-11-15T11:17:58.307 に答える