我有一个项目列表,我想创建两种方式对它们进行排序,按字母顺序排列和上次修改。
这就是我的所作所为:
// Alphabetically
tableItems = tableItems.OrderBy (MyTableItem => MyTableItem.ItemName).ToList();
reloadTable(tableItems);
// Last Modified
tableItems = tableItems.OrderBy (MyTableItem => MyTableItem.Timestamp).ToList();
reloadTable(tableItems);
这完全正常。
我的问题是我希望这种情况发生在列表中的所有项目中,除了一个 这一项将始终保持不变,我想确保它始终位于列表的顶部。
我需要做些什么呢?
如果重要,c#就是郎。
感谢您的时间。
答案 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();
符合谓词的项目将始终位于列表的顶部,其余元素将应用投影。