2

我有一本字典:

private Dictionary<long, TimeStampedFetchedPlans> remainingPlansById = null;

在哪里

public class TimeStampedFetchedPlans
{
    public DateTime TimeStamp { get; set; }
    public List<TFetchedPlanReturn> RemainingPlans { get; set; }

    public TimeStampedFetchedPlans(DateTime timeStamp, List<TFetchedPlanReturn> remainingPlans)
    {
        TimeStamp = timeStamp;
        RemainingPlans = remainingPlans;
    }
}

现在我想使用 LINQ 删除 Dictionary 中最旧的一半值。这可以做到吗?

4

2 回答 2

7

您可以通过创建一个新实例来纯粹使用 LINQ:

remainingPlansById = remainingPlansById.OrderByDescending(x => x.Value.TimeStamp)
                                       .Take(remainingPlansById.Count / 2)
                                       .ToDictionary(x => x.Key, x => x.Value);

但是,使用循环不需要创建新字典:

var itemsToRemove = remainingPlansById.OrderBy(x => x.Value.TimeStamp)
                                      .Take(remainingPlansById.Count / 2)
                                      .ToList();

foreach(var itemToRemove in itemsToRemove)
    remainingPlansById.Remove(itemToRemove.Key);

请注意,对于奇数数量的项目,这两个版本的行为不同。对于字典中的 41 个项目,第一个版本将保留20 并删除21,而第二个版本将删除20 并保留21。每个版本都可以轻松更改为另一个,您只需要确定您真正想要的行为。

于 2013-02-26T09:29:23.720 回答
0

为什么不在字典上使用Linq 方法“OrderBy”,然后结合使用Linq 方法“take”方法和count 方法,只读取字典的一半?

于 2013-02-26T09:30:34.560 回答