C# Linq SortedList过滤成SortedList

标签 c# linq filter sortedlist

我有一些代码,在这些代码中我做了一些奇怪的事情来从一个 SortedList 中获取信息并返回到另一个 SortedList 中。我执行我的 where 子句,然后必须将所有 KeyValuePair 单独放回新的 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);

我怀疑这应该是相当有效的,因为它总是会在构造期间向列表的末尾添加值。

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

关于C# Linq SortedList过滤成SortedList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5416201/

相关文章:

tsql - 如何在 T-SQL 存储过程中使用可选参数?

c# - 从 sql 查询 C# 填充系列

c# - 排除在调试中构建的文件

c# - 如何将 102.555 舍入为 102.55?

c# - Fogbugz 定价方案的算法

r - 使用过滤器 dplyr 无法过滤 df 中的现有值

c# - 隐式传递参数给基本构造函数

c# - 从 Int 数组到字符串数组的转换

c# - 使用成员访问 lambda 表达式参数化 LINQ to SQL 谓词

javascript - E4X按文本内容过滤?