Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何对常规列表中的部分项进行排序_C#_Linq_List_Sorting - Fatal编程技术网

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这是一种值得的方法-添加示例代码将使这个答案更好。不过请注意,实现有时可能比您想象的要复杂: