繁体   English   中英

C#Linq SortedList过滤到SortedList

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM