C#Linq分拣列表过滤到分拣列表

C#Linq分拣列表过滤到分拣列表,c#,linq,filter,sortedlist,C#,Linq,Filter,Sortedlist,我有一些代码,在其中我做了一些奇怪的事情,从一个分类列表中获取信息,然后返回到另一个分类列表中。我执行where子句,然后必须将所有KeyValuePairs分别放回新的SortedList中 这不是最有效的方法,或者说是推荐的方法,但我似乎找不到更好的方法 代码如下: SortedList<DateTime, CalendarDay> most_days = new SortedList<DateTime, C

我有一些代码,在其中我做了一些奇怪的事情,从一个分类列表中获取信息,然后返回到另一个分类列表中。我执行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);
SortedList最长天数=
新分类列表();
列出天数=此。所有天数。其中(
n=>n.Value.IsRequested | | n.Value.IsApproved
).ToList();
foreach(KeyValuePair kvp,以天为单位)
添加(kvp.Key,kvp.Value);
关于我如何清理这件事有什么想法吗(正如他们所说,少就是多)

谢谢


Jonathan

你当然可以删除
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);
那么调用代码将为:

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)
                      .ToSortedList(x => x.Key, x => x.Value);