c# - 按多列对 C# 列表进行排序

标签 c# wpf list sorting combobox

我有一个关于按多列对列表进行排序的问题。在下面的示例中,即使我排序显示 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/

相关文章:

c# - 如何获取当前 ItemsControl 项的索引?

c# - 如何为颜色选择器 (wpf) 创建颜色 Canvas

c# - 如果文本框有值(value),如何将其设置为只读?

c# - 通用接口(interface)和扩展方法发现的多个实现

c# - 具有径向渐变的 WPF 径向进度条

wpf - 在 wpf 数据网格中键入所选项目的列表

python - 基于纬度/经度的点列表之间的距离

list - 可靠集合上的用户-帖子-评论关系实现

python - 对 python 元组进行分箱。由于空箱而导致错误

c# - Unity碰撞删除然后添加回来