0

開始日に基づいて昇順で日付と時刻を並べ替えるコンソール アプリケーションを作成しようとしています。これは、私がやろうとしている例です。

私の入力:

休憩 Start1 = 15/02/12 12.30PM
休憩 End1= 15/02/12 01.30PM
休憩 Start2 = 15/02/12 11.00AM
休憩 End2= 15/02/12 12.00PM
休憩 Start3 = 15/02/12 12.00PM
休憩 End3= 15/02/12 01.00PM

私の出力は次のようになるはずです:

休憩 Start1 = 15/02/12 11.00AM
休憩 End1= 15/02/12 12.00PM
休憩 Start2 = 15/02/12 12.00PM
休憩 End2= 15/02/12 01.00PM
休憩 Start3 = 15/02/12 12.30PM
休憩 End3= 15/02/12 01.30PM

これを解決するための最良の方法を教えてください。

4

5 に答える 5

5

元の開始値と終了値をペアにして、開始日のみで並べ替えることをお勧めします。

まず、 と をペアリングする必要がStartありEndます。クラスの例:

public class Break
{
    public DateTime Start { get; set; }
    public DateTime End { get; set; }
}

そして、そのようなオブジェクトのコレクションを設定するときは、StartLINQ で並べ替えるだけです。

var breaks = new List<Break>()
                 {
                     new Break()
                         {
                             Start = new DateTime(2012,2,15,12,30,0),
                             End = new DateTime(2012,2,15,13,30,0)
                             ... /// etc.
                         }
                 };

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

編集

ペアになった日時オブジェクトを作成するには、次のようなメソッドを使用できます。

public static Break ConvertToBreak(string startDate, string endDate, object gmtOffset)
{
     var dtStart = UnixTimeConverter(startDate, System.Convert.ToDecimal(gmtOffset));
     var dtEnd =  UnixTimeConverter(endDate, System.Convert.ToDecimal(gmtOffset));
     return new Break{Start = dtStart, End = dtEnd};
}
于 2013-02-26T22:20:11.507 に答える
1

注:各開始/終了をペアとして扱うことになっている場合(それらが常に一緒になるように)、いくつかの小さな変更を行う必要があります(@ mipe34の回答を参照)。それ以外の場合は、これを行う方法の完全な動作例を次に示します。

static void Main(string[] args) {
    string text = 
  @"break Start1 = 15/02/12 12.30PM
    break End1= 15/02/12 01.30PM
    break Start2 = 15/02/12 11.00AM
    break End2= 15/02/12 12.00PM
    break Start3 = 15/02/12 12.00PM
    break End3= 15/02/12 01.00PM";

    string[] splitted = text.Split(new string[] {"\n", "\r"}, StringSplitOptions.RemoveEmptyEntries);
    IList<DateTime> starts = new List<DateTime>();
    IList<DateTime> ends = new List<DateTime>();
    for (int i = 0; i < splitted.Length; i++) {
        string line = splitted[i].Trim();
        string date = line.Split('=')[1].Trim();
        DateTime d = DateTime.ParseExact(date, "dd/MM/yy hh.mmtt", null);
        if (line.StartsWith("break Start")) {
            starts.Add(d);
        }
        else {
            ends.Add(d);
        }
    }

    starts = starts.OrderBy(x => x).ToList();
    ends = ends.OrderBy(x => x).ToList();

    for (int i = 0; i < starts.Count; i++) {
        Console.WriteLine("break Start{0} = {1}", i + 1, starts[i].ToString("dd/MM/yy hh.mmtt"));
        Console.WriteLine("break End{0} = {1}", i + 1, ends[i].ToString("dd/MM/yy hh.mmtt"));
    }

}
于 2013-02-26T22:17:10.517 に答える
1

日付/時刻オブジェクトを並べ替えたいだけのようです。投稿したコードは C# ではないため、いくつかの仮定を行います。

DateTimeまず、オブジェクトに日付と時刻の組み合わせがあるとしましょう。そして、あなたがそれらのリストを持っていると仮定します。

List<DateTime> dateTimes = new List<DateTime>();
dateTimes.AddRange(new []
{
    new DateTime(2012, 02, 15, 12, 30, 00),  // 15/02/12 12.30PM
    new DateTime(2012, 02, 15, 13, 30, 00),  // 15/02/12 01.30PM
    new DateTime(2012, 02, 15, 11, 00, 00),  // 15/02/12 11.00AM
    new DateTime(2012, 02, 15, 12, 00, 00),  // 15/02/12 12.00PM
    new DateTime(2012, 02, 15, 12, 00, 00),  // 15/02/12 12.00PM
    new DateTime(2012, 02, 15, 01, 00, 00),  // 15/02/12 01.00PM
});

次のように、その場で並べ替えることができます。

dateTimes.Sort();

または、配列またはIEnumerable<T>一般的なものがある場合は、順序付けられた新しい列挙可能なシーケンスを取得できます。

IEnumerable<DateTime> dateTimes = new []
{
    new DateTime(2012, 02, 15, 12, 30, 00),  // 15/02/12 12.30PM
    new DateTime(2012, 02, 15, 13, 30, 00),  // 15/02/12 01.30PM
    new DateTime(2012, 02, 15, 11, 00, 00),  // 15/02/12 11.00AM
    new DateTime(2012, 02, 15, 12, 00, 00),  // 15/02/12 12.00PM
    new DateTime(2012, 02, 15, 12, 00, 00),  // 15/02/12 12.00PM
    new DateTime(2012, 02, 15, 01, 00, 00),  // 15/02/12 01.00PM
};

var orderedDateTimes = dateTimes.OrderBy(dt => dt);
于 2013-02-26T22:11:15.977 に答える
1

ここに私がそれをする方法があります

それらがどのように送信されるかに関して、あなたがどのような特定の要件を持っているのかわかりません。または、終了時刻が常に開始時刻の 1 時間後にある場合、この例はそれに応じてそれらを並べ替える方法を簡単に示しています。

//GetYourInputValues() refers to however you plans on pulling in these inputs.
//It wasn't made clear in your post how you planned to do that.
string[] inputValues = GetYourInputValues(); 

//List that we will build, then sort, then print out.
List<DateTime> sortedDateTime = new List<DateTime>();

//Parse them into DateTime variables
foreach(var input in inputValues)
{
    DateTime inputDate;
    if(DateTime.TryParse(input, inputDate))
        sortedDateTime.Add(inputDate);
}
//Sort them ascending (for descending, flip a and b values)
sortedDateTime.Sort((a, b) => a.CompareTo(b));

//Print out the newly sorted values to console.
foreach(DateTime dt in sortedDateTime)
{
    Console.WriteLine(dt.ToString("MM/dd/yy hh:mm:ss tt")):
}
于 2013-02-26T22:14:05.610 に答える
1

すべての DateTimes を配列またはリストに配置し、標準の方法を使用して配列またはリストを並べ替えることができます。例については、こちらを参照してください: http://www.csharp-examples.net/sort-array

.NET では、DateTimeがインターフェイスを実装しているIComparableため、これらの種類の変数を比較/ソートするのは非常に簡単です。

そうは言っても、2 つの配列またはマトリックスを使用して、それぞれを個別に並べ替えることができます。これは、例から、開始列から 1 つの値を取得し、列から 1 つの値を取得するように見えるためです。

于 2013-02-26T22:07:30.983 に答える