[英]C# Linq SortedList Filtering into SortedList
我有一些代码,我正在做一些奇怪的事情,从SortedList获取信息,然后回到另一个SortedList。 我做了我的where子句,然后必须单独将所有KeyValuePairs放回到新的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);
我怀疑这应该是合理有效的,因为它总是会在构造期间将值添加到列表的末尾 。
(对于完整的工作,您需要添加接受自定义键比较器等的重载...请参阅ToDictionary
。)
不能直接回答你的问题(对不起!) - 更多关于这个问题的问题:
SortedList
吗? IEnumerable
,结果恰好是正确的顺序? 如果您在创建它之后从未打算向mostDays
集合添加/插入更多项目,那么您显然可以使用var mostDays = allDays.Where(n => n.Value.IsRequested || n.Value.IsApproved);
创建一个IEnumerable
var mostDays = allDays.Where(n => n.Value.IsRequested || n.Value.IsApproved);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.