5

我正在尝试使用Enumerable.OrderBy对 List 进行排序,因为最终我希望能够按多个字段进行排序。目前它似乎只有在我创建一个新变量var来保存结果视图时才有效,这意味着(我认为)需要重新转换类型。

有没有一种方法可以在保留原始 List 变量和类型的同时按多个字段对 List 进行排序?即我宁愿_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

这可以解决问题:

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

...但是创建新变量/引用没有真正的问题。

于 2012-10-10T13:42:28.510 回答
3

正如其他人所建议的那样,使用 LinqOrderBy(...).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 回答
1

我认为这会做到(它已经是一个订单箱列表,所以不需要强制转换):

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