C# 排序列表而不创建新变量
我尝试使用排序列表,因为最终我希望能够按多个字段进行排序。目前,只有在我创建一个新变量C# 排序列表而不创建新变量,c#,c#-4.0,C#,C# 4.0,我尝试使用排序列表,因为最终我希望能够按多个字段进行排序。目前,只有在我创建一个新变量var来保存results视图时,它才起作用,这意味着(我认为)需要重新转换类型 是否有一种方法可以在保留原始列表变量和类型的同时按多个字段对列表进行排序?也就是说,我宁愿以列表类型的变量\u orderedbins结束 下面是我目前拥有的,但从var test=。。。向前看似乎有点错误 public class orderedBins { public string Bin { get; set; }
var
来保存results视图时,它才起作用,这意味着(我认为)需要重新转换类型
是否有一种方法可以在保留原始列表变量和类型的同时按多个字段对列表进行排序?也就是说,我宁愿以列表类型的变量\u 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;
}
公共类orderedBins
{
公共字符串Bin{get;set;}
公共整数顺序{get;set;}
}
列表_orderedbins=新列表();
foreach(拆分箱中的字符串项)
{
字符串[]spbinSetting=item.Split(',');
boolbchecked=bool.Parse(spbinSetting[1]);
int border=int.Parse(spbinSetting[2]);
如果(b检查==真)
{
_Add(neworderedbins{bin=spbinSetting[0],Order=border});
}
}
var test=\u orderedbins.OrderBy(x=>x.Order);
foreach(测试中的var项目)
{
字符串f=item.Bin;
int g=项目订单;
}
这将实现以下目的:
_orderedbins = _orderedbins.OrderBy(x => x.Order).ToList();
…但创建新变量/引用并没有真正的问题。您知道,您可以通过以下方式对订单执行多个子排序
lst.OrderBy(x => x.Prop1).ThenBy(x => x.Prop2).ThenByDescending(x => x.Prop3)...
只需添加一个.ToList()
并使用变量引入它,以使结果成为列表变量
编辑:
威廉的伟大建议,为了提高可读性:
from x in lst
order by x.Prop1, x.Prop2, x.Prop3
select x
我认为这样就可以了(它已经是一个订购箱列表,因此不需要强制转换):
可以创建新的排序列表,而无需使用创建新变量
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());
公共类MyComparer:IComparer
{
公共整数比较(MyClass x,MyClass y)
{
如果(x.Field1!=y.Field1)
返回x.Field1.比较到(y.Field1)
其他的
返回x.Field2.CompareTo(y.Field2);
}
}
列表=新列表();
//填充列表
list.Sort(新的MyComparer());
正如其他人所建议的那样,使用Linq的OrderBy(…).ToList()将是一种更简洁的方法,但这将为您提供一个新的列表实例
保留原始实例,考虑使用<代码>列表.SORT()<代码>:
\u orderedbins.Sort(新比较((obj1,obj2)=>
{
int result=obj1.Order.CompareTo(obj2.Order);
返回结果!=0?结果:obj1.Bin.CompareTo(obj2.Bin);
}));
您是指变量(参考)还是对象本身?我是指变量(参考),我不需要保留原始的列表顺序,虽然通常您会得到这样更可读的代码:从x开始,按x.Prop1,x.Prop2,x.Prop3选择x
,这将避免您反复创建委托。这是唯一一个显示如何对多个属性排序的答案。@WillemDuncan感谢e提示!添加到答案中。要添加更多的答案,请在需要时使用降序
关键字,例如:按x.Prop1、x.Prop2降序、x.Prop3降序
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());
_orderedbins.Sort(new Comparison<orderedBins>((obj1, obj2) =>
{
int result = obj1.Order.CompareTo(obj2.Order);
return result != 0 ? result : obj1.Bin.CompareTo(obj2.Bin);
}));