首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# Linq SortedList滤波到SortedList中

C# Linq SortedList滤波到SortedList中
EN

Stack Overflow用户
提问于 2011-03-24 07:51:03
回答 2查看 7.8K关注 0票数 8

我有一些代码,其中我正在做一些奇怪的事情,从SortedList中获取信息,然后返回到另一个SortedList中。我执行where子句,然后必须将所有的KeyValuePairs分别放回一个新的SortedList中。

这不可能是最有效的方法,甚至是推荐的方法,但我似乎找不到更好的方法。

以下是代码:

代码语言:javascript
复制
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);

关于我如何清理这个问题,有什么想法(正如他们所说的,少就是多)?

谢谢,

乔纳森

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-24 07:56:33

当然,您可以删除ToList调用--这对您一点帮助都没有。

您可以将调用代码简化如下:

代码语言:javascript
复制
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扩展方法。

代码语言:javascript
复制
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;
}

然后调用代码将是:

代码语言:javascript
复制
var mostDays = allDays.Where(n => n.Value.IsRequested || n.Value.IsApproved)
                      .ToSortedList(x => x.Key, x => x.Value);

我怀疑这应该是合理有效的,因为在建设过程中,它总是会在列表的末尾增加价值。

(对于一个完整的工作,您可能希望添加重载、接受自定义键比较器等.见ToDictionary.)

票数 11
EN

Stack Overflow用户

发布于 2011-03-24 09:27:53

不是直接回答你的问题(对不起!)-更多的是关于这个问题的一个问题:

你真的需要输出成为一个SortedList

  • Or吗?如果输出是一个IEnumerable,结果恰好是正确的,你能生存下来吗?

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5416201

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档