2010-01-25 3 views
3

나는 과거 X일 반환하는 방법을 가지고는 현재 다음을 수행합니다C 번호 목록

var dates = new List<DateTime>(); 

for (int i = 0; i < numDays; i++) 
{ 
    dates.Add(DateTime.Today.AddDays(-i)); 
} 

return dates; 

이 일을 더 컴팩트 방법이 있어야한다처럼 아마도 사용하는 느낌 LINQ. 제안? 또한, 내가 그것을 가지고있는 방식으로 유지한다면 루프 내에서 변수에 저장하고 루프 내에서 해당 값을 AddDays이라고 부르는 경우 이것이 더 효율적일 것이라고 DateTime.Today입니다.

편집 : LINQ는 지연 평가를 사용합니까? 나는 내 머리에 미친 이미지를 받고 있어요 :

start 캡처
return DateTime.AllDaysInTheHistoryOfTimeEver.Where(day => 
    day.BeforeOrOn(DateTime.Today) && 
    day.After(DateTime.Today.AddDays(-numDays)) 
); 
+0

을 heHistoryOfTimeEver! – DOK

답변

12
var start = DateTime.Today; 
var days = Enumerable.Range(0, numDays).Select(i => start.AddDays(-i)).ToList(); 

은 자정 무렵 그것을 실행 코너의 경우를 피할 수 있습니다.

+0

흥미로운 솔루션. 한 줄에 : var qry = Enumerable.Range (0, numDays) .Select (i => DateTime.Today.AddDays (-i)). ToList(); – Armstrongest

+2

@Atomiton - 지금 실행하기 전에 * 자정 바로 전에 - -p –

+0

@Marc : 나는 당신의 솔루션을 사용하고 있으며 나는 당신이했던 것처럼'DateTime.Today'을 잡았지만 설명 할 수 있습니까? 왜이 수정이 필요한지에 대한 링크를 줄 수 있습니까? 코너 사건? 폐쇄와 함께 뭔가? –

0

목록에서 값을 수집하는 대신 IEnumerator 또는 IEnumerable을 반환하고 yield 키워드를 사용할 수 있습니다.

MSDN 기사를 참조

+1

MSDN 기사를 읽고 싶지 않습니다. 이 작업을 수행하는 코드 예를 보여줄 수 있습니까? – DOK

+0

@DOK : Pharabus의 대답은'yield'를 사용합니다 : http://stackoverflow.com/questions/2134893/c-list-of-past-datetimes/2134956#2134956 –

+0

@DOK : 당신의 의견은 저를 축복했습니다! – Armstrongest

1

어쩌면 LINQ 그러나 당신이 당신의 정확한 요구 사항 (즉, NUMDAYS)에 대해 확실하지, 반복자와 함께 할 수 있지만 아래 당신에게 지난 10 일을 얻을 수 없습니다.

var dates = GetDates(DateTime.Now.AddDays(-10),DateTime.Now); 

public IEnumerable<DateTime> GetDates(DateTime StartingDate, DateTime EndingDate) 
     { 
      while (StartingDate <= EndingDate) 
      { 
       yield return StartingDate; 
       StartingDate = StartingDate.AddDays(1); 
      } 
     } 
+0

나는 'yield'사용에 대한 귀하의 제안을 좋아합니다. 내 메서드가 사용되는 방식을 확인하고 반복자가 더 적합한 지 확인합니다. –

1

마크의 대답은 시작 시간을 캡처하는 더 설득력있는 이유를 제공하지만, 반사가 내 죄를 즐거움 중 하나입니다, 그래서 확인하고 ... 시작 시간을 캡처하는 것도 있지만 (더 효율적이 될 것이라고 발견 잘 , 당신이 알고, 지금까지 문제에 대한 가능성, 등)

당신이 DateTime.Today 전화, 이미 DateTimeKind.Local의 날짜를 사용하여 오버 헤드에 비해 좀 더 처리를 추가 UtcNow.ToLocalTime() 반환, LOL AllDaysInT을

public virtual DateTime ToLocalTime(DateTime time) 
{ 
    if (time.Kind == DateTimeKind.Local) 
    { 
     return time; 
    } 
    bool isAmbiguousLocalDst = false; 
    long utcOffsetFromUniversalTime = ((CurrentSystemTimeZone) CurrentTimeZone).GetUtcOffsetFromUniversalTime(time, ref isAmbiguousLocalDst); 
    return new DateTime(time.Ticks + utcOffsetFromUniversalTime, DateTimeKind.Local, isAmbiguousLocalDst); 
} 
+0

배경 정보를 제공해 주셔서 감사합니다. :) –