C# 如何对常规列表中的部分项进行排序
我有一个列表对象,其中包含以下类型的项C# 如何对常规列表中的部分项进行排序,c#,linq,list,sorting,C#,Linq,List,Sorting,我有一个列表对象,其中包含以下类型的项 public class Item{ public int Type; //this can be only 0 or 1 public string Text; } 我想先按类型对整个列表进行排序,然后仅对类型为1的项目按文本进行另一种排序 如何做到这一点 非常感谢 Ming如果您不介意同时订购0类商品,那么您可以这样做 var sortedItems = items.OrderBy(i => i.Type).ThenBy(
public class Item{
public int Type; //this can be only 0 or 1
public string Text;
}
我想先按类型对整个列表进行排序,然后仅对类型为1的项目按文本进行另一种排序
如何做到这一点
非常感谢
Ming如果您不介意同时订购0类商品,那么您可以这样做
var sortedItems = items.OrderBy(i => i.Type).ThenBy(i => i.Text);
var sortedItems = items.OrderBy(i => i.Type).ThenBy(i => i.Type == 0 ? "A" : i.Text);
否则,如果需要保留类型0项的原始顺序,则可以执行以下操作:
var sortedItems = items.OrderBy(i => i.Type).ThenBy(i => i.Text);
var sortedItems = items.OrderBy(i => i.Type).ThenBy(i => i.Type == 0 ? "A" : i.Text);
如果您不介意订购类型为0的商品,那么您可以这样做
var sortedItems = items.OrderBy(i => i.Type).ThenBy(i => i.Text);
var sortedItems = items.OrderBy(i => i.Type).ThenBy(i => i.Type == 0 ? "A" : i.Text);
否则,如果需要保留类型0项的原始顺序,则可以执行以下操作:
var sortedItems = items.OrderBy(i => i.Type).ThenBy(i => i.Text);
var sortedItems = items.OrderBy(i => i.Type).ThenBy(i => i.Type == 0 ? "A" : i.Text);
我会这样做的
var ordered = list.OrderBy(i => i.Type == 0 ? "" : i.Text);
这是假设i==0时不存在空文本字符串。如果你不能做出这样的假设,那么以下几点就行了:
var ordered = list.OrderBy(i => i.Type).ThenBy(i => i.Type == 0 ? "" : i.Text);
通过给所有类型为0的项赋予相同的值,您将使它们保持初始顺序,同时按文本值对其他项进行排序
另一方面,这是一种代码气味:
public int Type; //this can be only 0 or 1
乍一看,这听起来应该是一个布尔或自定义枚举类型。在深入了解您试图执行的操作之后,如果Type为0,则可能您甚至不希望文本是合法值。如果是这样的话,你应该考虑使用类继承来区分一个项目类型和另一个项目类型。 < P>这是我该怎么做的。
var ordered = list.OrderBy(i => i.Type == 0 ? "" : i.Text);
List<Item> items;
items = items.OrderBy(i => i.Type).ThenBy(i => i.Type == 1 ? i.Text : null);
这是假设i==0时不存在空文本字符串。如果你不能做出这样的假设,那么以下几点就行了:
var ordered = list.OrderBy(i => i.Type).ThenBy(i => i.Type == 0 ? "" : i.Text);
通过给所有类型为0的项赋予相同的值,您将使它们保持初始顺序,同时按文本值对其他项进行排序
另一方面,这是一种代码气味:
public int Type; //this can be only 0 or 1
乍一看,这听起来应该是一个布尔或自定义枚举类型。在深入了解您试图执行的操作之后,如果Type为0,则可能您甚至不希望文本是合法值。如果是这样的话,你应该考虑使用类继承来区分一个项目类型和另一个项目类型。 < P>你的问题并不完全清楚。听起来您需要两种不同的排序,而不是对一个字段进行排序,然后在类型为1时进行稳定的重新排序
List<Item> items;
items = items.OrderBy(i => i.Type).ThenBy(i => i.Type == 1 ? i.Text : null);
假设前者:
var sortByType = items.OrderBy(x => x.Type)
.ToList();
var sortTheOnesByText = items.Where(x => x.Type == 1)
.OrderBy(x => x.Text)
.ToList();
你的问题不是很清楚。听起来您需要两种不同的排序,而不是对一个字段进行排序,然后在类型为1时进行稳定的重新排序 假设前者:
var sortByType = items.OrderBy(x => x.Type)
.ToList();
var sortTheOnesByText = items.Where(x => x.Type == 1)
.OrderBy(x => x.Text)
.ToList();
我想你的意思是你想把所有的type=0放在前面,所有的type=1放在后面,并且在type=1的地方按文本排序
items.OrderBy(item => item.Type).ThenBy (item => type == 0 ? "" : item.Text)
我想你的意思是你想把所有的type=0放在前面,所有的type=1放在后面,并且在type=1的地方按文本排序
items.OrderBy(item => item.Type).ThenBy (item => type == 0 ? "" : item.Text)
实现IComparable
请参见示例中的详细信息
而不仅仅是使用List.Sort方法实现IComparable
请参见示例中的详细信息
不仅仅是使用List.Sort方法所以,如果类型只能是0或1,这不是使用枚举的好时机吗?公共枚举MyType{TypeA=0,TypeB=1};你试过什么?它是否需要作为两个单独的调用来完成,以便用户可以选择order by:type或filter by:type?因此,如果type只能是0或1,这不是使用枚举的好时机吗?公共枚举MyType{TypeA=0,TypeB=1};你试过什么?是否需要将其作为两个单独的调用来完成,以便用户可以选择order by:type或filter by:type?+1这是一个值得采用的方法-添加示例代码将使这个答案更好。不过请注意,实现有时可能比您想象的要复杂:+1这是一种值得的方法-添加示例代码将使这个答案更好。不过请注意,实现有时可能比您想象的要复杂: