排序列表而不创建新变量

时间:2012-10-10 13:40:43

标签: c# c#-4.0

我正在尝试使用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;
}

5 个答案:

答案 0 :(得分:5)

您知道,您可以通过...执行订单的多个子排序。

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

只需添加.ToList();并将其与变量一起引入,即可将结果放在列表变量中。

编辑:

Willem提出了更好的建议:

from x in lst
order by x.Prop1, x.Prop2, x.Prop3
select x

答案 1 :(得分:3)

这样可以解决问题:

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

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

答案 2 :(得分:3)

您可以使用

创建新的排序列表而无需创建新变量
list = list.OrderBy(item => item.Field1).ThenBy(item => item.Field1).ToList();

它仍然会创建一个全新的列表(添加一个新变量实际上不是一个问题;那些便宜。创建一个新列表,这样做,只要列表不是很大就可以了

如果您需要对列表进行排序,那么您将需要使用自定义比较器和List的排序方法:

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());

答案 3 :(得分: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);
}));

答案 4 :(得分:1)

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

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