2

私は次のクラスのアイテムのリストを持っています:

public class MonthlyConsumption : UserData
{
    public string Unit { get; set; }

    public List<DailyConsumption> DailyConsumptions { get; set; }
}

public class DailyConsumption
{
    public DateTime Day { get; set; }
    public double? Value { get; set; }
}

ご覧のとおり、アイテムのリストがあり、各アイテムには日数のリストも含まれています。

私の質問は、メインリストを内部リスト内の特定の要素で並べ替える方法です。

例:MonthlyConsumptionタイプのリストがあります。そのリストの各要素には、DailyConsumptionタイプのコレクションがあり、このコレクションには、今年の1月から10日があります。1月1日までにメインリストを注文するにはどうすればよいですか?

更新:問題を間違った言葉で表現しているのではないかと思います。本当にやりたいのは、MonthlyConsumptionタイプのリストを注文することです。ここで、各アイテムには、特定の日の値によるDailyConsumptionタイプの独自のリストがあるため、リスト内の各アイテムに1月1日から10日までの彼の内部コレクションの10日間、メインリストを1月1日の値順に並べたいと思います。

私が試した更新

return monthlyConsumption.OrderBy(x => x.DailyConsumptions.Where(y => y.Day.Day == 1))
                         .ToList();

しかし、それは私に少なくとも1つのオブジェクトを実装する必要がありますIComparable

4

3 に答える 3

4

テストはしていませんが、Linq でできると思います。

「monthlyConsumptions」がList<MonthlyConsumption>.

monthlyConsumptions.OrderBy(mc => mc.DailyConsumptions.Min(dc => dc.Day));

これにより、MonthlyConsumptionのリストが最も古い順に並べられますDailyConsumption

于 2013-01-14T04:28:18.167 に答える
1

試す:

monthlyConsumptions
    .SelectMany(mc => mc.DailyConsumptions)
    .Where(dc = > dc.Day.Date.Day == 1 && dc.Day.Date.Month == 1)
    .OrderBy(dc => dc.Value)
    .Select(dc => dc.MonthlyConsumption);

これは all DailyConsumptionsfor allを取得しMonthlyConsumptions、1 月 1 日からのものだけをフィルタリングし、それらを並べValue替えて、そこからデータを取得する代わりに、親エンティティを返しますMonthlyConsumption

だからあなたはIQuerable<MonthlyConsumption>あなたが望むように注文されます。

DailyConsumption編集:それはLINQ to Entities で機能しますMonthlyConsumption

于 2013-01-14T10:08:46.990 に答える
1

私が正しく理解していれば、おそらくこのようなものがあなたが求めているものです:

var targetDay = DateTime.Now; //set to Jan 1st
var result =
    monthylConsumptions.OrderBy(
        x =>
        x.DailyConsumptions.Where(y => y.Day.Date == targetDay.Date).Select(z => (!z.Value.HasValue ? 0 : z.Value.Value)).SingleOrDefault());

あなたの例では、「targetDay」は1月1日に設定する必要があります。

これにより、指定した日の値で昇順に並べ替えられ、その特定の月に値がない場合は常に既定値が考慮されます。

編集: 次の単体テストをテストしたところ、説明しているエラーを表示せずに合格しました:

[TestFixture]
public class LinqSortTest
{
    public class MonthlyConsumption
    {
        public string Unit { get; set; }

        public List<DailyConsumption> DailyConsumptions { get; set; }
    }

    public class DailyConsumption
    {
        public DateTime Day { get; set; }
        public double? Value { get; set; }
    }

    [Test]
    public void SomeTest()
    {
        var targetDay = new DateTime(2013, 1, 1);
        var monthlyConsumptions = new List<MonthlyConsumption>();
        monthlyConsumptions.Add(new MonthlyConsumption
            {
                Unit = "first",
                DailyConsumptions = new List<DailyConsumption>
                    {
                                new DailyConsumption { Day = new DateTime(2013, 1, 1), Value = 5 },
                                new DailyConsumption { Day = new DateTime(2013, 1, 5), Value = 100 }
                    }
            });
        monthlyConsumptions.Add(
            new MonthlyConsumption
                {
                    Unit = "second",
                    DailyConsumptions =
                        new List<DailyConsumption>
                            {
                                new DailyConsumption { Day = new DateTime(2013, 1, 1), Value = 2 },
                                new DailyConsumption { Day = new DateTime(2013, 1, 5), Value = 1 }
                            }
                });

        var result =
            monthlyConsumptions.OrderBy(
                x =>
                x.DailyConsumptions.Where(y => y.Day.Date == targetDay.Date).Select(
                    z => (!z.Value.HasValue ? 0 : z.Value.Value)).SingleOrDefault()).ToList();

        Assert.AreEqual("second", result[0].Unit);
    }
}

ご覧のとおりAssert、「second」の 1 月 1 日の値が「first」よりも低かったため、実際に 2 番目のアイテムが最初に配置されたことが確認されます。

于 2013-01-14T05:40:37.667 に答える