-1

日時の並べ替えに関して既に別の質問をし、別のユーザーから値を渡すように助けてもらいました。以下のような for ループを使用していますが、コードが並べ替えではなく値を 1 つずつ取得するため、ここでは間違いなく間違っています。

public class Break
{
    public DateTime MealStart { get; set; }
    public DateTime MealEnd { get; set; }
}

私のメインクラス

IList<DateTime> starts = new List<DateTime>();
IList<DateTime> ends = new List<DateTime>();
DateTime breakStart1 = new DateTime(2012, 02, 15, 12, 30, 00);  // 15/02/12 12.30PM
DateTime breakEnd1 = new DateTime(2012, 02, 15, 13, 30, 00);  // 15/02/12 01.30PM
DateTime breakStart2 = new DateTime(2012, 02, 15, 11, 00, 00);  // 15/02/12 11.00AM
DateTime breakEnd2 = new DateTime(2012, 02, 15, 12, 00, 00);  // 15/02/12 12.00PM
DateTime breakStart3 = new DateTime(2012, 02, 15, 12, 00, 00);  // 15/02/12 12.00PM
DateTime breakEnd3 = new DateTime(2012, 02, 15, 01, 00, 00);  // 15/02/12 01.00PM
starts.Add(breakStart1);
starts.Add(breakStart2);
starts.Add(breakStart3);
ends.Add(breakEnd1);
ends.Add(breakEnd2);
ends.Add(breakEnd3);
for (int i = 0; i < starts.Count; i++)
{
    var breaks = new List<Break>()
    {
        //for (int j= 0; j<starts.Count; j++)
        //{
        new Break()
        {
            MealStart = starts[i],
            MealEnd = ends[i]

        }
        // }
    };

    var ordered = breaks.OrderBy(s => s.MealStart);
    foreach (var ord in ordered)
    {
        System.Console.WriteLine(ord.MealStart);
        System.Console.WriteLine(ord.MealEnd);
    }
}

私は以下のような結果を期待しています

breakStart1 = 15/02/12 11.00AM
breakEnd1= 15/02/12 12.00PM
breakStart2 = 15/02/12 12.00PM
breakEnd2= 15/02/12 01.00PM
breakStart3 = 15/02/12 12.30PM
breakEnd3= 15/02/12 01.30PM

しかし、それは for ループが原因ではありません。

4

2 に答える 2

3

after ever ループを作成breaksしています。次のように、ループの外でこれを行う必要があります。

IList<DateTime> starts = new List<DateTime>();
IList<DateTime> ends = new List<DateTime>();
DateTime breakStart1 = new DateTime(2012, 02, 15, 12, 30, 00);  // 15/02/12 12.30PM
DateTime breakEnd1 = new DateTime(2012, 02, 15, 13, 30, 00);  // 15/02/12 01.30PM
DateTime breakStart2 = new DateTime(2012, 02, 15, 11, 00, 00);  // 15/02/12 11.00AM
DateTime breakEnd2 = new DateTime(2012, 02, 15, 12, 00, 00);  // 15/02/12 12.00PM
DateTime breakStart3 = new DateTime(2012, 02, 15, 12, 00, 00);  // 15/02/12 12.00PM
DateTime breakEnd3 = new DateTime(2012, 02, 15, 01, 00, 00);  // 15/02/12 01.00PM
starts.Add(breakStart1);
starts.Add(breakStart2);
starts.Add(breakStart3);
ends.Add(breakEnd1);
ends.Add(breakEnd2);
ends.Add(breakEnd3);
List<Break> breaks = new List<Break>();
for (int i = 0; i < starts.Count; i++)
{
    breaks.Add(new Break()
    {
        MealStart = starts[i],
        MealEnd = ends[i]
    });
}
var ordered = breaks.OrderBy(s => s.MealStart);
foreach (var ord in ordered)
{
    System.Console.WriteLine(ord.MealStart);
    System.Console.WriteLine(ord.MealEnd);
}
于 2013-02-27T03:55:27.343 に答える
2

@Coryluluが基本的な問題で私を打ち負かしたので、少し短い別の方法を次に示します。

IEnumerable<Break> breaks = 
    starts.Zip(ends, (s, e) => new Break { MealStart = s, MealEnd = e })
    .OrderBy(b => b.MealStart);

foreach (Break brk in breaks)
    Console.WriteLine("Start: {0}\tEnd: {1}", brk.BreakStart, brk.BreakEnd);

このIEnumerable.Zipメソッドは、 と変換関数のペアを取り、各入力のメンバーで変換関数を呼び出した結果を含むIEnumerable出力を生成します。もちろん、最後にaを付けて a に変換できます。IEnumerableIEnumerableList<Break>ToList()

于 2013-02-27T04:04:44.257 に答える