【问题标题】:customize OrderBy for a List?为列表自定义 OrderBy?
【发布时间】:2014-12-27 05:02:07
【问题描述】:

我有一个项目列表,我想创建两种排序方式,按字母顺序和上次修改时间。

这就是我所做的:

// Alphabetically
tableItems = tableItems.OrderBy (MyTableItem => MyTableItem.ItemName).ToList();
reloadTable(tableItems);

// Last Modified
tableItems = tableItems.OrderBy (MyTableItem => MyTableItem.Timestamp).ToList();
reloadTable(tableItems);

而且效果很好。

我的问题是我希望列表中的所有项目都发生这种情况,除了一个。
这一项将始终保持不变,我想确保它始终位于列表顶部。

为此我需要做什么?

如果重要的话,c# 就是语言。

感谢您的宝贵时间。

【问题讨论】:

    标签: c# android linq listview collections


    【解决方案1】:
    tableItems = tableItems.OrderBy(i => i.ItemName != "yourexceptitem").ThenBy(i => i.Timestamp).ToList();
    

    编辑: 如果要对除一个以外的项目名称进行排序,请这样做,

     tableItems = tableItems.OrderBy(i => i.ItemName != "TestSubject3").ToList();
    

    【讨论】:

    • 我想我没有问对问题。 Itemname 和 timestamp 是两个完全不同的排序选项。假设我只想按名称排序,但除了名为“TestSubject3”的项目之外的所有项目。我该怎么做?
    【解决方案2】:

    其他通用解决方案:

    public static IEnumerable<T> OrderByExcept<T>(
                    this IEnumerable<T> source,
                     Predicate<T> exceptPredicate,
                     Func<IEnumerable<T>, IOrderedEnumerable<T>> projection)
    {
        var rest = new List<T>();
    
        using (var enumerator = source.GetEnumerator())
        {
            while (enumerator.MoveNext())
            {
                if (exceptPredicate(enumerator.Current))
                {
                    yield return enumerator.Current;
                }
                else
                {
                    rest.Add(enumerator.Current);
                }
            }
        }
    
        foreach (var elem in projection(rest))
        {
            yield return elem;
        }
    }
    

    用法:

    tableItems = tableItems.OrderByExcept(
                             item => item.ItemName == "TestSubject3",
                             items => items.OrderBy(MyTableItem => MyTableItem.ItemName)
                                           .ThenBy(MyTableItem => MyTableItem.TimeStamp))
                           .ToList();
    

    满足谓词的项目将始终位于列表顶部,将应用投影到其余元素。

    【讨论】:

    • 很高兴知道这一点。目前,其他解决方案工作正常,但这将有助于其他条件。谢谢
    猜你喜欢
    • 2014-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多