4

月と日のリストがあり、指定された日付の間でこのリストの各月と日を検索する必要があります。希望する出力を得る最善の方法を提案してくれる人はいますか?

例えば:

月日一覧 -> 01/11、03/15、05/25、09/01

日付間 -> 2012 年 1 月 1 日から 2013 年 7 月 1 日

期待される結果:

2012 年 11 月 1 日、2013 年 11 月 1 日

2012 年 3 月 15 日、2013 年 3 月 15 日

2012 年 5 月 25 日、2013 年 5 月 25 日

2012/09/01

私はこのように試しましたが、日付と日付の間に年数のギャップがある場合、メモリ例外が発生し、時間とメモリの複雑さが増します。それを取得するための簡単な解決策はありますか?

DateTime[] dateDates = new DateTime[dateTypeList.Rows.Count];
//convert strings to datetimes:
for (int i = 0; i < dateTypeList.Rows.Count; i++)
{
    dateDates[i] = Convert.ToDateTime(Convert.ToDateTime(string.Format("{0}/{1}", Convert.ToInt32(dateTypeList.Rows[i]["Month"]), Convert.ToInt32(dateTypeList.Rows[i]["Day"]))));
}

//define start and end time:
DateTime dateStart = new DateTime(2012, 1, 1);
DateTime dateEnd = new DateTime(2013, 7, 1);

List<DateTime> results = new List<DateTime>();
//loop days between start and end time:
for (DateTime a = dateStart; a <= dateEnd; a.AddDays(1))
{
    for (int i = 0; i < dateDates.Length; i++)
    {
        if (dateDates[i] == a)
        {
            results.Add(a);
        }
    }
}
4

4 に答える 4

3

編集:さて、あなたが達成しようとしていることについてもっとわかりました。

したがって、次の入力があります。

  • 開始日と終了日
  • 月と日のペアのリスト。現在、実際にはこれを持っていませんが、それは論理的に持っているものです。

現在のコードは、複数の年が存在する可能性があるという事実をまったく考慮していません。

まず、データ テーブルを適切に変換しましょう。

var monthDays = dateTypeList.Rows.AsEnumerable()
                            .Select(row => new { Month = row.Field<int>("Month")
                                                 Day = row.Field<int>("Day") })
                            .ToList();

これで、次を使用できます。

for (int year = startDate.Year; year <= endDate.Year; year++)
{
    foreach (var pair in monthDays)
    {
        // Avoid creating a date which doesn't exist...
        if (!DateTime.IsLeapYear(year) && pair.Month == 2 && pair.Day == 29)
        {
            continue;
        }
        DateTime date = new DateTime(year, pair.Month, pair.Day);
        if (date <= startDate && date <= endDate)
        {
            results.Add(date);
        }
    }
}

これは差し迫った問題です:

for (DateTime a = dateStart; a <= dateEnd; a.AddDays(1))

DateTime は不変であるためAddDays、戻り値を使用しない場合は効果がありません。あなたがしたい:

for (DateTime a = dateStart; a <= dateEnd; a = a.AddDays(1))

このコードも変更します。

dateDates[i] = Convert.ToDateTime(
  Convert.ToDateTime(string.Format("{0}/{1}", 
      Convert.ToInt32(dateTypeList.Rows[i]["Month"]), 
      Convert.ToInt32(dateTypeList.Rows[i]["Day"]))));
  • 理由もなく文字列表現を経由しています
  • Convert.ToDateTime理由もなく2回電話しています
  • システムの日付形式が月/日であると想定していますが、これはカルチャ固有です
于 2012-11-07T07:18:38.663 に答える
2
public class Class1
{
    public static void Main()
    {
        var dayList = new List<customMonthDay>{
            new customMonthDay{ Day = 11, Month = 1 },
            new customMonthDay{ Day = 15, Month = 3 },
            new customMonthDay{ Day = 25, Month = 5 },
            new customMonthDay{ Day = 1, Month = 9 }
        };

        var startDate = new DateTime( 2012, 1, 1 );
        var endDate = new DateTime( 2013, 7, 1 );

        var listYears = getYears(startDate, endDate);

        var includedDays = new List<customMonthDayYear>();

        foreach (var year in listYears)
        {
            foreach (var day in dayList)
            {
                var candidateday = new customMonthDayYear { Year = year, Month = day.Month, Day = day.Day };
                if (candidateday.ToDateTime() > startDate && candidateday.ToDateTime() < endDate)
                    includedDays.Add(candidateday);
            }
        }

        includedDays.ForEach(x => Console.WriteLine(x.ToDateTime().ToString()));
    }

    protected static List<int> getYears(DateTime start, DateTime end)
    {
        var years = new List<int>();
        int diff = end.Year - start.Year;
        for ( int i = 0; i <= diff; i++ )
        {
            years.Add( start.Year + i );
        }
        return years;
    }

    public class customMonthDay
    {
        public int Day { get; set; }
        public int Month { get; set; }
    }

    public class customMonthDayYear : customMonthDay
    {
        public int Year { get; set; }

        public DateTime ToDateTime()
        {
            return new DateTime(Year, Month, Day);
        }
    }
}
于 2012-11-07T07:20:05.463 に答える
0

これは私にとってはうまくいきますが、linqなどを使用してこれを減らす方法はまだありますか?

private List<DateTime> GetDates(DataTable dateTypeList, DateTime fromDate, DateTime toDate)
        {
            List<DateTime> results = new List<DateTime>();
            fromDate = Convert.ToDateTime(fromDate.ToShortDateString());
            toDate=Convert.ToDateTime(toDate.ToShortDateString());

            int minDay = fromDate.Day;
            int minMonth = fromDate.Month;
            int minYear = fromDate.Year;
            int maxDay = toDate.Day;
            int maxMonth = toDate.Month;
            int maxYear = toDate.Year;
            for (int j = minYear; j <= maxYear; j++)
            {
                for (int i = 0; i < dateTypeList.Rows.Count; i++)
                {

                    int _day = Convert.ToInt32(dateTypeList.Rows[i]["Day"]);
                    int _month = Convert.ToInt32(dateTypeList.Rows[i]["Month"]);
                    DateTime tempDate = new DateTime(j, _month, _day);
                    if ((tempDate >= fromDate) && (tempDate <= toDate))
                    {
                        results.Add(tempDate);
                    }

                }
            }

            return dateTypeList;
            throw new NotImplementedException();
        }
于 2012-11-07T09:19:31.830 に答える
0

以下を使用します。

for each date in list

 a.Equals(date) or a.CompareTo(date)
于 2012-11-07T06:43:33.337 に答える