0

今月のすべての日曜日を抽出し、次のコードを作成したい:

 private string GetDatesOfSundays(DateTime DatMonth)
 {
  string sReturn = "";
  int iDayOffset = DatMonth.Day - 1;
  DatMonth = DatMonth.AddDays(System.Convert.ToDouble(-DatMonth.Day + 1));
  DateTime DatMonth2 = DatMonth.AddMonths(1).AddDays(System.Convert.ToDouble(-1));
  while (DatMonth < DatMonth2)
  {
    if (DatMonth.DayOfWeek == System.DayOfWeek.Sunday)
    {
      if (sReturn.Length > 0) sReturn += ",";
      sReturn += DatMonth.ToShortDateString();
    }
    DatMonth = DatMonth.AddDays(1.0);
  }
  return sReturn;
}   

[HttpGet]
public ActionResult TradeUKKPISearchesData()
{
  string allSundaysInMonth = GetDatesOfSundays(System.DateTime.Now);  
  //var reportData = _reportingService.GetTradeUKKPISearches();
  //return View(reportData);
}

問題は allSundaysInMonth のタイプ文字列にあり、もちろん空でもあります。sReturn は文字列型ですが、ここでも日付を渡します(私は知っています:))が、allSundaysInMonthはどの型にする必要がありますか? sReturnには正しい日付があります...これらの日付をコントローラーのビューのドロップダウンに表示して、ユーザーがレポートを実行する必要がある日曜日を選択できるようにする必要があります。

ありがとう

4

2 に答える 2

5

どうですか

private IEnumerable<DateTime> GetDatesOfSundays(DateTime DatMonth)
{
    int iDayOffset = DatMonth.Day - 1;   
    DatMonth = DatMonth.AddDays(System.Convert.ToDouble(-DatMonth.Day + 1));
    DateTime DatMonth2 =
        DatMonth.AddMonths(1).AddDays(System.Convert.ToDouble(-1));
    while (DatMonth < DatMonth2)
    {
        if (DatMonth.DayOfWeek == System.DayOfWeek.Sunday)
        {
            yield return DatMonth;
        }

        DatMonth = DatMonth.AddDays(1.0);
    }
}

このような拡張機能として関数を書き直したくなるでしょう

public static IEnumerable<Datetime> DaysOfMonth(
    this DateTime any,
    DayOfWeek day)
{
    // start at first of month
    var candidate = new DateTime(any.Year, any.Month, 1);

    var offset = (int)day - (int)candidate.DayOfWeek;

    if (offset < 0)
    {
        offset += 7
    }

    candidate = candidate.AddDays(offset);

    while (cadidate.Month == any.Month)
    {
        yield return candidate;
        candidate = candidate.AddDays(7.0)
    }
}

次に、このように使用できます

var allSundaysInMonth = DateTime.Now.DaysOfMonth(DayOfWeek.Sunday);

IEnumerable<DateTime>を に変換したい場合はstring、これを行うことができます。

var listOfDates = string.Join<DateTime>(", ", allSundaysInMonth);

この string.Joinオーバーロードを使用して


あなたが本当にDateTime[]これを行うことができるように日が欲しいなら(しかし必要はありません)

DateTime[] allSundaysInMonth = GetDatesOfSundays(DateTime.Now).ToArray();

または私の拡張例の場合

var allSundaysInMonth = DateTime.Now.DaysOfMonth(DayOfWeek.Sunday).ToArray();
于 2012-08-03T09:47:48.917 に答える
0

DateTime[]またはに行くことができますIEnumerable<DateTime>

メソッドの署名は

private IEnumerable<DateTime> GetDatesOfSundays(DateTime DatMonth)

また

private DateTime[] GetDatesOfSundays(DateTime DatMonth)

あなたIEnumerableがこれに行くと働いていない場合

private DateTime[] GetDatesOfSundays(DateTime DatMonth)
{
    List<DateTime> lst = new List<DateTime>();

    DatMonth = DatMonth.AddDays(-DatMonth.Day + 1);
    DateTime DatMonth2 = DatMonth.AddMonths(1).AddDays(System.Convert.ToDouble(-1));

    while (DatMonth < DatMonth2)
    {
        if (DatMonth.DayOfWeek == System.DayOfWeek.Sunday)
        {
            lst.Add(DatMonth);
            DatMonth = DatMonth.AddDays(7);
            continue;
        }

        DatMonth = DatMonth.AddDays(1);
    }

    return lst.ToArray();
}

そしてそれを次のように呼び出します

DateTime[] allSundaysInMonth = GetDatesOfSundays(System.DateTime.Now);
于 2012-08-03T09:45:39.520 に答える