我有一个关于按多列对列表进行排序的问题。在下面的示例中,即使我排序显示 None,A First Description,B Second...
,列表仍按插入的顺序打印。
List<MySample> samples = new List<MySample>();
samples.Add(new MySample { SortOrder = 1, Data = "A First Description", Description = "A First Description" });
samples.Add(new MySample { SortOrder = 1, Data = "C Third Description", Description = "C Third Description" });
samples.Add(new MySample { SortOrder = 1, Data = "B Second Description", Description = "B Second Description" });
samples.Add(new MySample { SortOrder = 0, Data = "None", Description = "None" });
samples.OrderBy(a => a.SortOrder).ThenBy(a => a.Description).ToList();
foreach (var item in samples)
{
Console.WriteLine(item);
}
public class MySample
{
public int SortOrder { get; set; }
public string Description { get; set; }
public object Data { get; set; }
}
如果我更改我的代码以执行以下操作,那么它会按所需的顺序打印。
samples = samples.OrderBy(a => a.SortOrder).ThenBy(a => a.Description).ToList();
是否可以在不分配的情况下完成排序(如上)?
仅供引用,此示例不是实际代码。我需要通过使用 FrameworkElementFactory
的代码将此列表数据绑定(bind)到 WPF
中的 ComboBox
。
感谢您的帮助!
更新我的方法:
var collectionView = CollectionViewSource.GetDefaultView(<My list to be sorted>);
collectionView.SortDescriptions.Add(new SortDescription("SortOrder", ListSortDirection.Ascending));
collectionView.SortDescriptions.Add(new SortDescription("Description", ListSortDirection.Ascending));
上面的代码在 UI 中起到了作用。我感谢大家的快速回答。
最佳答案
原因是因为 OrderBy
不转换调用它的对象,而是返回一个新的结果。你应该像这样使用它:
samples = samples.OrderBy(a => a.SortOrder).ThenBy(a => a.Description).ToList();
这就是 OrderBy
函数的工作方式。为什么您需要它以其他方式工作,尤其是对于几个额外的字符。
您可以通过创建您自己的扩展方法使其工作,除了处理对对象的引用而不是创建新结果之外,这些扩展方法做同样的事情,但这不值得麻烦全部。
如果您需要一些东西,您可以像这样将 LINQ 包装在扩展方法中:
public static void MyOrderBy(this List<MySample> list)
{
list = list.OrderBy(a => a.SortOrder).ThenBy(a => a.Description).ToList();
}
然后像这样使用它:
samples.MyOrderBy();
虽然这只是一个想法,但我不知道它是否可行,或者它是否是个好主意。
关于c# - 按多列对 C# 列表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15576282/