C# 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.
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);