我有一些代码,在这些代码中我做了一些奇怪的事情来从一个 SortedList 中获取信息并返回到另一个 SortedList 中。我执行我的 where 子句,然后必须将所有 KeyValuePair 单独放回新的 SortedList。
这不可能是最有效的,或者确实是推荐的方法,但我似乎找不到更好的方法。
代码如下:
SortedList<DateTime, CalendarDay> most_days =
new SortedList<DateTime, CalendarDay>();
List<KeyValuePair<DateTime, CalendarDay>> days = this.all_days.Where (
n => n.Value.IsRequested || n.Value.IsApproved
).ToList();
foreach (KeyValuePair<DateTime, CalendarDay> kvp in days)
most_days.Add(kvp.Key, kvp.Value);
关于如何清理它的任何想法(正如他们所说,少即是多)?
谢谢,
乔纳森
最佳答案
你当然可以删除 ToList
打电话 - 那对你一点帮助都没有。
您可以像这样简化调用代码:
var dictionary = allDays.Where(n => n.Value.IsRequested || n.Value.IsApproved)
.ToDictionary(x => x.Key, x => x.Value);
var mostDays = new SortedList<DateTime, CalendarDay>(dictionary);
...但这将构建一个中间体 Dictionary<,>
, 所以效率不高。
另一种选择是您可以编写自己的 ToSortedList
扩展方法,例如
public static SortedList<TKey, TValue> ToSortedList<TSource, TKey, TValue>
(this IEnumerable<TSource> source,
Func<TSource, TKey> keySelector,
Func<TSource, TValue> valueSelector)
{
// TODO: Argument validation
var ret = new SortedList<TKey, TValue>();
foreach (var element in source)
{
ret.Add(keySelector(element), valueSelector(element));
}
return ret;
}
那么调用代码就是:
var mostDays = allDays.Where(n => n.Value.IsRequested || n.Value.IsApproved)
.ToSortedList(x => x.Key, x => x.Value);
我怀疑这应该是相当有效的,因为它总是会在构造期间向列表的末尾添加值。
(对于完整的工作,您需要添加接受自定义 key 比较器等的重载...请参阅 ToDictionary
。)
关于C# Linq SortedList过滤成SortedList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5416201/