4

リストを複数の列でソートする方法について質問があります。次のサンプルでは、​​ show に並べ替えてもNone, A First Description, B Second...、リストは挿入された順序で印刷されます。

List<MySample> samples = new List<MySample>();

samples.Add(new MySample { SortOrder = 1, Data = "A First Description", Description = "A First Description" });
samples.Add(new MySample { SortOrder = 1, Data = "C Third Description", Description = "C Third Description" });
samples.Add(new MySample { SortOrder = 1, Data = "B Second Description", Description = "B Second Description" });
samples.Add(new MySample { SortOrder = 0, Data = "None", Description = "None" });
samples.OrderBy(a => a.SortOrder).ThenBy(a => a.Description).ToList();

foreach (var item in samples)
{
    Console.WriteLine(item);
}

public class MySample
{
    public int SortOrder { get; set; }
    public string Description { get; set; }
    public object Data { get; set; }
}

次のようにコードを変更すると、目的の順序で印刷されます。

samples = samples.OrderBy(a => a.SortOrder).ThenBy(a => a.Description).ToList();

(上記のように)割り当てなしで注文を行うことはできますか?

参考までに、この例は実際のコードではありません。ComboBoxを使用して、このリストをWPFコードビハインドにデータバインドする必要がありますFrameworkElementFactory

ご協力いただきありがとうございます!

私のアプローチで更新してください:

var collectionView = CollectionViewSource.GetDefaultView(<My list to be sorted>);
collectionView.SortDescriptions.Add(new SortDescription("SortOrder", ListSortDirection.Ascending));
collectionView.SortDescriptions.Add(new SortDescription("Description", ListSortDirection.Ascending));

上記はUIでトリックを行いました。迅速な回答に感謝します。

4

4 に答える 4

4

その理由は、OrderBy呼び出されたオブジェクトを変換せず、代わりに新しい結果を返すためです。次のように使用する必要があります。

samples = samples.OrderBy(a => a.SortOrder).ThenBy(a => a.Description).ToList();

これがOrderBy関数の動作方法です。なぜあなたはそれが他の方法で機能する必要があるのでしょうか、特にほんの数文字の余分な文字のために。

新しい結果を作成するのではなく、オブジェクトへの参照を処理する以外は同じことを行う独自の拡張メソッドを作成することで、それを機能させることができますが、これはまったく問題の価値がありません


ただし、何かが必要な場合は、次のような拡張メソッドでLINQをラップすることができます。

public static void MyOrderBy(this List<MySample> list)
{
    list = list.OrderBy(a => a.SortOrder).ThenBy(a => a.Description).ToList();
}

そしてそれをそのように使う:

samples.MyOrderBy();

それはただのアイデアですが、それが機能するかどうか、またはそれが良いアイデアであるかどうかはわかりません。

于 2013-03-22T17:20:33.197 に答える
1

例を次のように変更できます。

//other code above...
samples.Add(new MySample { SortOrder = 0, Data = "None", Description = "None" });
foreach (var item in samples.OrderBy(a => a.SortOrder).ThenBy(a => a.Description))
//other code below...

は順序によって変更されないことに注意してくださいsamples。特定のループスルーの順序のみが設定されます。

どちらも受け入れられない場合は、必要性を詳しく説明してください。

于 2013-03-22T17:31:13.847 に答える
0

別の方法として、「他に何も当てはまらない場合を除いて、これを行わないでください」というルートでは、新しいプロパティを追加して、融合で並べ替えることができます。

class NoReallyThisIsACodeSmell
{
    public string SortPlusDescription
    {
           return string.Concat(SortOrder, Description);
    }
}
于 2013-03-22T17:34:14.203 に答える