我有一些代码,其中我正在做一些奇怪的事情,从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);关于我如何清理这个问题,有什么想法(正如他们所说的,少就是多)?
谢谢,
乔纳森
发布于 2011-03-24 07:56:33
当然,您可以删除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.)
发布于 2011-03-24 09:27:53
不是直接回答你的问题(对不起!)-更多的是关于这个问题的一个问题:
你真的需要输出成为一个SortedList
IEnumerable,结果恰好是正确的,你能生存下来吗?如果您从未打算在创建mostDays集合之后向它添加/插入更多项,那么显然可以使用var mostDays = allDays.Where(n => n.Value.IsRequested || n.Value.IsApproved);创建一个IEnumerable
https://stackoverflow.com/questions/5416201
复制相似问题