【问题标题】:Sort List without creating new variable排序列表而不创建新变量
【发布时间】:2012-10-10 22:10:41
【问题描述】:

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

是否有一种方法可以在保留原始 List 变量和类型的同时按 1 个以上的字段对 List 进行排序? IE。我宁愿以List<orderedbins> 类型的变量_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;
}

【问题讨论】:

  • 你是指变量(引用)还是对象本身?
  • 我的意思是变量(参考),我不需要保留原来的列表顺序

标签: c# c#-4.0


【解决方案1】:

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

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

【讨论】:

  • 虽然通常你会得到像这样更易读的代码:from x in lst order by x.Prop1, x.Prop2, x.Prop3 select x,但它会省去你一遍又一遍地创建委托的麻烦。支持您,因为它只是显示如何在多个属性上订购的答案。
  • @WillemDuncan 感谢您的提示!添加到答案。
  • 要添加更多答案,请在需要时使用 descending 关键字,例如:order by x.Prop1, x.Prop2 descending, x.Prop3
【解决方案2】:

你可以创建一个新的排序列表而不用创建一个新的变量使用

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

【讨论】:

    【解决方案3】:

    这样就可以了:

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

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

    【讨论】:

      【解决方案4】:

      正如其他人所建议的,使用 Linq 的 OrderBy(...).ToList() 会是一种更简洁的方式,但这会给您一个新的列表实例。

      要保留原始实例,请考虑使用List&lt;T&gt;.Sort()

      _orderedbins.Sort(new Comparison<orderedBins>((obj1, obj2) =>
      {
          int result = obj1.Order.CompareTo(obj2.Order);
          return result != 0 ? result : obj1.Bin.CompareTo(obj2.Bin);
      }));
      

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-08-06
          • 1970-01-01
          • 1970-01-01
          • 2019-01-03
          • 1970-01-01
          • 2014-07-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多