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