5

最終的には複数のフィールドで並べ替えることができるようにしたいので、Enumerable.OrderByを使用してリストを並べ替えようとしています。現時点ではvar、結果ビューを保持するために新しい変数を作成した場合にのみ機能するように見えます。つまり、型を再キャストする必要があるということです。

元のリスト変数とタイプを保持しながら、複数のフィールドでリストを並べ替える方法はありますか?つまり、私はむしろ_orderedbinsタイプの変数で終わることを望みますList<orderedbins>

以下は私が現在持っているものですが、var test=...以降のすべてが少し間違っているようです。

public class orderedBins
{
    public string Bin { get; set; }
    public int Order { get; set; }
}

List<orderedbins> _orderedbins = new List<orderedbins>();
foreach (string item in splitbins)
{
    string[] spbinSetting = item.Split(',');
    bool bchecked = bool.Parse(spbinSetting[1]);
    int border = int.Parse(spbinSetting[2]);

    if (bchecked == true)
    {
        _orderedbins.Add(new orderedbins { bin = spbinSetting[0], Order = border });
    }
}

var test =_orderedbins.OrderBy(x => x.Order);
foreach (var item in test)
{
   string f = item.Bin;
   int g = item.Order;
}
4

5 に答える 5

5

ご存じのとおり、注文に対して複数のサブソートを実行できます...

lst.OrderBy(x => x.Prop1).ThenBy(x => x.Prop2).ThenByDescending(x => x.Prop3)...

a を追加.ToList();して変数で導入するだけで、結果がリスト変数になります。

編集:

読みやすくするために、ウィレムによる素晴らしい提案:

from x in lst
order by x.Prop1, x.Prop2, x.Prop3
select x
于 2012-10-10T13:43:16.517 に答える
4

を使用して、新しい変数を作成せずに、新しいソート済みリストを作成できます。

list = list.OrderBy(item => item.Field1).ThenBy(item => item.Field1).ToList();

ただし、完全に新しいリストが作成されます (新しい変数を追加することは実際にはそれほど問題ではありません。それらは安価です。リストがそれほど大きくない限り、これを行う新しいリストを作成することは問題ありません。

リストをその場で並べ替える必要がある場合は、リストの並べ替えメソッドでカスタム比較子を使用する必要があります。

public class MyComparer : IComparer<MyClass>
{

    public int Compare(MyClass x, MyClass y)
    {
        if(x.Field1 != y.Field1)
            return x.Field1.CompareTo(y.Field1)
        else
            return x.Field2.CompareTo(y.Field2);
    }
}

List<MyClass> list = new List<MyClass>();
//Populate list

list.Sort(new MyComparer());
于 2012-10-10T13:49:11.360 に答える
3

他の人が示唆したように、Linq を使用OrderBy(...).ToList()するとよりクリーンな方法になりますが、これによりリストの新しいインスタンスが得られます。

元のインスタンスを保持するには、次の使用を検討してList<T>.Sort()ください。

_orderedbins.Sort(new Comparison<orderedBins>((obj1, obj2) =>
{
    int result = obj1.Order.CompareTo(obj2.Order);
    return result != 0 ? result : obj1.Bin.CompareTo(obj2.Bin);
}));
于 2012-10-10T14:10:41.280 に答える
3

これはトリックを行います:

_orderedbins = _orderedbins.OrderBy(x => x.Order).ToList();

...しかし、新しい変数/参照の作成に実際の問題はありません。

于 2012-10-10T13:42:28.510 に答える
1

これでうまくいくと思います(すでにオーダービンのリストなので、キャストは必要ありません):

_orderbins = _orderbins.OrderBy(x => x.Order).ToList();
于 2012-10-10T13:44:10.860 に答える