2012-03-01 2 views
-1

내가 날짜 시간의 목록을 설정하고 C# 정렬 날짜 시간이 문제

3/1/2012 10:56 
3/1/2012 17:03 
3/1/2012 1:38 
3/1/2012 5:33 

그때 나는 목록에 넣어 종류 :

List<DateTime> ldtBites = new List<DateTime>(); 
ldtBites.Add(a1); 
ldtBites.Add(a2); 
ldtBites.Add(a3); 
ldtBites.Add(a4); 
ldtBites.Sort(); 

정렬 후 나는이 얻을 :

3/1/2012 1:38:00 AM 
3/1/2012 10:56 AM 
3/1/2012 5:03:00 PM 
3/1/2012 5:33:00 AM 
+2

나는 이것을 재현 할 수 없다. 위에 게시 한 코드를 실행하면 날짜가 올바르게 정렬됩니다. 언뜻보기에 그것은 알파벳 순으로 정렬 된 것처럼 보입니다. 어떻게 목록을 출력하고 있습니까? –

+0

@Shannon : 마지막 결과가 실제로 3/1인지 확실합니까? 귀하의 코드를 테스트 할 때 실수로 결과가 귀하의 주문으로 발행되었지만 마지막 행은 2012 년 3 월 2 일이었습니다. 아래를 참조하십시오. –

답변

2

w, x, y, z의 정의를 생략했습니다. 나는 그것들을 다음과 같이 정의했다 :

DateTime w = new DateTime(2012, 3, 1, 10, 56, 0); 
DateTime x = new DateTime(2012, 3, 1, 17, 3, 0); 
DateTime y = new DateTime(2012, 3, 1, 1, 38, 0); 
DateTime z = new DateTime(2012, 2, 29, 17, 3, 0); 

이것은 a1-a4에 대한 값과 일치시킨다. 그러나 나머지 코드를 실행하면 올바르게 정렬됩니다 (a3, a4, a1, a2).

그러나, 나는 x와 z는, 같은시/분이었다 것으로 나타났습니다 나의 초기 시험이 있었다 :

내가 이것을 실행하면, 내가 순서대로 나오을 가지고
DateTime z = new DateTime(2012, 3, 1, 17, 3, 0); 

당신이 보여주는 한을 (a3, a1, a2, a4); 그러나 AddHours() 전화가 전달 된 후 z 값은 실제로 3/2/2012이었습니다. 이것이 마지막 이유입니다.

+0

Adam 당신 말이 맞았습니다. 오류가있는 출력을 보지 않고 실제로 코드를 실행 한 것으로 보입니다. 코드를 5 시간 연속 보는 실수를 저지른 것 같습니다 ... 감사합니다! – Shannon

0

그런 다음 (DateTimestring 표현으로 데이터를 저장하지 않습니다)가 적용된 서식 어떤 못된 DateTime 객체, 다시 그 문자열을 구문 분석, strings로 변환, DateTime 개체를 만들 수 있습니다. 즉, 초기 .ToString() 호출은 아무 효과가 없습니다.

DateTime 개체를 보풀이없는 목록에 추가하면됩니다 (string 회 전환 없음, 구문 분석 없음, 단지 Convert.ToDateTime() 호출). DateTime 개체에 .ToString()을 호출하면 목록을 정렬 한 후에 만

또는 DateTimes이 아닌 strings을 목록에 추가하고 정렬 할 수 있습니다. 이 경우 Sort 작업은 DateTime 정렬 규칙 대신 (알파벳순) 정렬 규칙을 따릅니다.

0

문자열로 변환하고 다시 변환하면 그 결과가 발생할 수 있습니다. x, y, w, z를 목록에 직접 추가하지 않으시겠습니까?

List<DateTime> ldtBites = new List<DateTime>(); 
ldtBites.Add(DateTime.Parse("3/1/2012 10:56")); 
ldtBites.Add(DateTime.Parse("3/1/2012 17:03")); 
ldtBites.Add(DateTime.Parse("3/1/2012 1:38")); 
ldtBites.Add(DateTime.Parse("3/1/2012 5:33")); 
ldtBites.Sort(); 

foreach (DateTime dt in ldtBites) 
    Console.WriteLine(dt); 

출력 :

2012-03-01 오전 1시 38분 0초

2012-03-01 오전 5시 33분 0초

2012-03-01 10 : 2012-03-01 오후 5시 3분 0초

눌러 AM

아무 키나 56:00 계속합니다. . .

0

앞뒤로 변환하고 싶지 않습니다. 한 번 해봐. 목록을 먼저 정렬 한 다음 문자열로 변환하십시오.

0

위의 모든 날짜가 사건의 날짜는 또한 다음을 수행해야 다른, 동일한 경우 사용하지 않습니다 ... 단지 다른

var sortedDates = dates.OrderByDescending(x => x); 

또는 일을하거나하지 않는 것 Linq을 알면 다음과 같이 갈 수 있습니다.

static List SortAscending(List list) 
{ 
list.Sort((a, b) => a.CompareTo(b)); 
return list; 
} 

static List SortDescending(List list) 
{ 
list.Sort((a, b) => b.CompareTo(a)); 
return list; 
}