2010-12-09 8 views
2

날짜 배열에 아래 값이 있습니다 : "07/07/2011", "08/05/2011", "09/07/2011", "12/07/2011"컬렉션에서 누락 날짜 찾기

이 코드를 C# 프로그램의 입력으로 사용하면 날짜가 누락 된 새 모음집을 만들어야합니다. 2011 년 10 월 7 일, 11/07/2011

재귀가이를 수행하는 가장 좋은 방법입니까?

감사합니다.

+1

재귀는 종종 대답하지 않습니다. 그러나 질문에 대해서는, 1) "08/05/2011"은 "08/07/2011"이어야합니까? 2) 당신이 제공 한 날짜와 누락 된 날짜에 대한 월별 간격이 있듯이 암시 패턴이 실제 패턴입니까? –

+0

아이디어를 얻으려면 다음 질문을 참조하십시오. http://stackoverflow.com/search?q=missing+dates+%5Bc%23%5D –

+0

문자열이나 날짜 시간으로 저장하고 있습니까? –

답변

3

전혀 아님. 이것은 간단한 과정이어야합니다. 시작 날짜가 있고 간격이 ... 배열을 걷기 시작하고 다음 값이 이전 값과 간격을 더한 값과 일치하지 않으면 새 배열에 새 값을 삽입합니다. 일치하는 경우 해당 값을 복사합니다. 그런 다음 날짜와 어떤 메타 데이터를 유용을 보유하고 클래스를 만들고 각 항목에 대한 더 많은 데이터 (메타 데이터)이 필요한 경우

(예를 들어, 부울 같은 this_value_was_inserted_artificially)

불필요하게 일을 복잡하게 할 재귀를 사용.

2

재귀가 필요하지 않습니다. 이것은 아마도 최적화 할 수 있지만, 작업을 수행해야합니다

public static IEnumerable<DateTime> FindMissingDates(IEnumerable<DateTime> input) 
{ 
    // get the range of dates to check 
    DateTime from = input.Min(); 
    DateTime to = input.Max(); 

    // how many days? 
    int numberOfDays = to.Subtract(from).Days; 

    // create an IEnumerable<DateTime> for all dates in the range 
    IEnumerable<DateTime> allDates = Enumerable.Range(0, numberOfDays) 
     .Select(n => from.AddDays(n)); 

    // return all dates, except those found in the input 
    return allDates.Except(input); 
} 
+0

OP가 * months *의 간격을 찾고있는 것처럼 보입니다. –

+0

@Dan Tao : 미국인인지 아닌지에 따라 다릅니다. –

+0

전혀 신경 쓰지 않아, 내가 미국에있는 것을 잊어 버렸다. 우리가 우리의 연대기를 뒤에서 적어 둔다.) –

1

당신은 Linq에 매우 잘이 해낼 수 있습니다

var dates=new[]{ 
    DateTime.Parse("07/07/2011"), 
    DateTime.Parse("08/07/2011"), 
    DateTime.Parse("09/07/2011"), 
    DateTime.Parse("12/07/2011")}; 

var days=(dates.Max()-dates.Min()).Days; 

var otherDays= 
    Enumerable 
     .Range(0,days) 
     .Select(d=>dates.Min().AddDays(d)) 
     .Except(dates);