-1

タイプdatetimeのキーとオブジェクトのリストとしての値を使用して、ソートされた辞書を検索しています。私が見つける必要があるのは、辞書内の各オブジェクトの最新の値 (オブジェクトのプロパティに基づく) です。私のオブジェクトには、名前、値、作成日という 3 つのプロパティがあります。私の辞書は最新の日付で降順にソートされています。

私は何とかこれを機能させましたが、LINQ を使用したショートカットがあると確信しています。私は.NET 3.5を使用していることに注意してください。助けていただけますか?わかりやすくするために追加したので、以下の膨大な量のコードに気を悪くしないでください。リスト オブジェクトのリスト内でクエリを実行するための linq クエリを探しているだけです。

以下のコード:

public void Should_link_recent_data_together()
{
    var data = TimeSeriesDataFactoryEx.GetData();

    var allAttributes = new List<string>()
    {
        TimeSeriesConstants.TOTAL_COST_CODE,
        TimeSeriesConstants.TOTAL_VALUE_CODE,
        TimeSeriesConstants.SOURCE_CODE
    };

    var latestList = new List<TimeSeries>();

    var allValues = data.Values.ToList();


    #region HOW DO I DO THIS USING LINQ?

    bool found = false;

    foreach (var attribute in allAttributes)
    {
        found = false;
        foreach (var tsData in allValues)
        {
            foreach (var ts in tsData)
            {
                if (ts.MetricName == attribute && !string.IsNullOrEmpty(ts.MetricValue))
                {
                    latestList.Add(ts);
                    found = true;
                    break;
                }
            }
            if (found)
                break;
        }
    }

    #endregion

    Assert.IsTrue(latestList.Count == 3);
    Assert.IsTrue(latestList.Where(x => x.MetricName == TimeSeriesConstants.TOTAL_COST_CODE).First().MetricValue == "1");
    Assert.IsTrue(latestList.Where(x => x.MetricName == TimeSeriesConstants.TOTAL_VALUE_CODE).First().MetricValue == "2");
    Assert.IsTrue(latestList.Where(x => x.MetricName == TimeSeriesConstants.SOURCE_CODE).First().MetricValue == "gp");
    Assert.IsTrue(latestList.Where(x => x.MetricName == TimeSeriesConstants.SOURCE_CODE).First().Quarter == DateTime.Today.AddMonths(-3));

}



internal class TimeSeriesDataFactoryEx
{
    public static SortedDictionary<DateTime?,List<TimeSeries>> GetData()
    {
        return new SortedDictionary<DateTime?, List<TimeSeries>>(new DateComparer())
        {
            {
                DateTime.Today, new List<TimeSeries>()
                {
                    new TimeSeries()
                    {
                        Quarter = DateTime.Today,
                        MetricValue = "1",
                        MetricName = TimeSeriesConstants.TOTAL_COST_CODE
                    },
                    new TimeSeries()
                    {
                        Quarter = DateTime.Today,
                        MetricValue = "2",
                        MetricName = TimeSeriesConstants.TOTAL_VALUE_CODE
                    },
                    new TimeSeries()
                    {
                        Quarter = DateTime.Today,
                        MetricValue = "",
                        MetricName = TimeSeriesConstants.SOURCE_CODE
                    }
                }
            },
            {
                DateTime.Today.AddMonths(-3), new List<TimeSeries>()
                {
                    new TimeSeries()
                    {
                        Quarter = DateTime.Today.AddMonths(-3),
                        MetricValue = "3",
                        MetricName = TimeSeriesConstants.TOTAL_COST_CODE
                    },
                    new TimeSeries()
                    {
                        Quarter = DateTime.Today.AddMonths(-3),
                        MetricValue = "4",
                        MetricName = TimeSeriesConstants.TOTAL_VALUE_CODE
                    },
                    new TimeSeries()
                    {
                        Quarter = DateTime.Today.AddMonths(-3),
                        MetricValue = "gp",
                        MetricName =TimeSeriesConstants.SOURCE_CODE
                    }
                }
                }

        };
    }
}
4

1 に答える 1

0

だから、私があなたの質問を正しく理解していると仮定すると、次のような辞書があるとします:

{ Key = "1/1/1900", Value = List Of Objects, of which each has a DateTimeProperty }
...
{ Key = "1/4/1900", Value = List Of Objects, of which each has a DateTimeProperty }

そして、辞書から一連のオブジェクトを見つけようとしていて、各キーの時刻が最新である場合、linq を使用してこれを非常に簡単に行うことができます。

var latestItems = data.SelectMany(kvp => 
    kvp.Value.OrderByDescending(value => value.Quarter).Take(1)
);

このクエリは、各バケット内の最新のオブジェクトを検索し、それを単一のセット (列挙可能なオブジェクトではなく) として返します。内のセレクターを変更して、そのコールバックから をSelectMany返す限り、必要なだけ各セット内の要素を見つけることができます。IEnumerable

于 2013-04-24T19:25:31.107 に答える