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);

アイテムの数が不均一な場合、2つのバージョンの動作が異なることに注意してください。辞書の41項目について、最初のバージョンは20を保持して21を削除し、2番目のバージョンは20を削除して21を保持します。各バージョンは他のバージョンに簡単に変更でき、実際に必要な動作を決定する必要があります。

于 2013-02-26T09:29:23.720 に答える
0

辞書でLinqメソッド「OrderBy」を使用してから、Linqメソッド「take」メソッドをcountメソッドと組み合わせて使用​​して、辞書の半分だけを読み取ってみませんか?

于 2013-02-26T09:30:34.560 に答える