C# C列表按两列排序

C# C列表按两列排序,c#,sorting,C#,Sorting,我有一个C自定义对象列表,需要按两个不同的变量排序,一个是布尔值,另一个是字符串。我可以根据这两个标准中的任何一个进行排序,但我很难找出如何组合它们。排序应该是首先选中的所有布尔值,然后是每个值的姓氏。现在我用 result.Sort((x, y) => string.Compare(x.CheckedIn.ToString(), y.CheckedIn.ToString())); result.Sort((x, y) => string.Compare(x.LastName, y.

我有一个C自定义对象列表,需要按两个不同的变量排序,一个是布尔值,另一个是字符串。我可以根据这两个标准中的任何一个进行排序,但我很难找出如何组合它们。排序应该是首先选中的所有布尔值,然后是每个值的姓氏。现在我用

result.Sort((x, y) => string.Compare(x.CheckedIn.ToString(), y.CheckedIn.ToString()));
result.Sort((x, y) => string.Compare(x.LastName, y.LastName));
但我如何组合才能使我的结果像这样呢

CheckedIn-Name
No - Aames
No - Smith
Yes - Barnes
Yes - Peters
使用linq

如果你有L个类的对象列表

public class temp
{
public bool x;
public string y;
}
然后使用:

L.orderby(a=>a.x).thenby(a=>a.y);

您可以将其链接到任意位置。

我有一个类,它使用_Records变量中的列表创建CSV文件。我需要一种事后整理的方法,而林克并不好

result.Sort((x,y) => x.CheckedIn==y.CheckedIn ? 
  string.Compare(x.LastName, y.LastName) : 
  (x.CheckedIn ? -1 : 1) );
这就是我通过传递我想要排序的列的索引创建的多重排序

public void OrderBy(params int[] columnIndexes)
{
    _Records.Sort((x, y) =>
    {
        foreach (int i in columnIndexes)
        {
            int result = string.Compare(x[i], y[i]);
            if (result != 0)
                return result;
        }
        return 0;
    });
}
那么用法将是

csv.OrderBy(1, 3, 5);

下面是我编写的一个扩展方法,用于按任意数量的键对列表进行排序:

public static class ListExtensions
{
    public static void SortBy<T>(this List<T> list, params Expression<Func<T, IComparable>>[] keys)
    {
        if (list == null)
            throw new ArgumentNullException("list");
        if(keys == null || !keys.Any())
            throw new ArgumentException("Must have at least one key!");
        list.Sort((x, y) => (from selector in keys 
                             let xVal = selector.Compile()(x) 
                             let yVal = selector.Compile()(y) 
                             select xVal.CompareTo(yVal))
                             .FirstOrDefault(compared => compared != 0));
    }
}
用法:

var List<Person> persons = GetPersons();
myList.SortBy(p => p.LastName, p => p.FirstName);

请注意,这大致相当于:myList=myList.OrderByp=>p.LastName.ThenByp=>p.FirstName。

通过这样做,我可以快速完成一些事情。。由于这两列都是文本,只需将它们添加到一起,即可快速完成排序

this.Project.Tasks.Sortx,y=>String.Comparex.Assignee+x.Task,y.Assignee+y.Task


这是我的比较链解决方案。它将负责聚合您感兴趣排序的所有比较器类。构建器模式可以很容易地提供列进行排序,并得到排序后的列表。

在他的例子中,结果是result.OrderByx=>x.CheckedIn.ThenByx=>x.LastName;我认为ThenBy不会对对象执行排序,而是返回一个新的排序列表,因此它应该是result=result.OrderByx=>x.CheckedIn.ThenByx=>x.LastName;编辑:您可能需要一个新变量,因为结果类型是IOrderedEnumerable对象。编辑2:您可以使用ToList返回到变量,如lahsrah的答案所示。在评论之前,我最好先阅读所有内容:我不想问一个非常类似的问题-因此,如果您想使用.sort按double和string类型进行排序,那么等价物是什么?
var List<Person> persons = GetPersons();
myList.SortBy(p => p.LastName, p => p.FirstName);