为List定制OrderBy?

时间:2014-12-27 05:02:08

标签: c# android linq listview collections

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

这就是我的所作所为:

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

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

这完全正常。

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

我需要做些什么呢?

如果重要,c#就是郎。

感谢您的时间。

2 个答案:

答案 0 :(得分:2)

tableItems = tableItems.OrderBy(i => i.ItemName != "yourexceptitem").ThenBy(i => i.Timestamp).ToList();

修改 如果要对项目名进行排序,除了一项,请执行此操作,

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

答案 1 :(得分:1)

其他通用解决方案:

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();

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