【问题标题】:C# Linq SortedList Filtering into SortedListC# Linq SortedList 过滤成 SortedList
【发布时间】:2011-07-21 22:23:53
【问题描述】:

我有一些代码,我在其中做一些奇怪的事情来从 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);

关于我如何清理它的任何想法(正如他们所说,少即是多)?

谢谢,

乔纳森

【问题讨论】:

    标签: c# linq filter sortedlist


    【解决方案1】:

    好吧,您当然可以删除 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&lt;,&gt;,所以效率很低。

    另一种选择是您可以编写自己的 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);
    

    我怀疑这应该是相当有效的,因为它总是会在构造过程中向列表的 end 添加值。

    (对于完整的工作,您需要添加接受自定义键比较器等的重载...请参阅ToDictionary。)

    【讨论】:

    • 这就是我喜欢这个网站的原因。快速的答案效果很好,让我觉得我学到了一些重要的东西。谢谢乔恩。
    【解决方案2】:

    不是您的问题的直接答案(对不起!) - 更多关于问题的问题:

    • 您真的需要输出为SortedList吗?
    • 或者您能否在输出为IEnumerable 而结果恰好按正确顺序排列的情况下存活下来?

    如果您在创建 mostDays 集合后从不打算添加/插入更多项目,那么您显然可以使用 var mostDays = allDays.Where(n =&gt; n.Value.IsRequested || n.Value.IsApproved); 创建一个 IEnumerable

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-13
      • 1970-01-01
      • 2013-05-20
      • 1970-01-01
      • 1970-01-01
      • 2013-01-18
      相关资源
      最近更新 更多