2012-08-03 3 views
0

Je veux extraire tous les dimanches du mois en cours et ont ce code:Je ne sais pas de quel type il devrait être

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); 
} 

le problème réside dans ma chaîne de type pour allSundaysInMonth et est également vide ofcourse. Le sReturn est de type string mais là encore je passe une date (je sais :)) mais quel type devrait allSundaysInMonth être? sReturn a les dates correctes dans ... J'ai besoin d'afficher ces dates dans une liste déroulante dans la vue du contrôleur afin que l'utilisateur puisse sélectionner l'un des dimanches pour lesquels il/elle a besoin d'exécuter un rapport.

grâce

+2

'' IEnumerable me semble bon – Jodrell

+0

DATETIME [] 'serait également faire –

+0

j'ai essayé: IEnumerable allSundaysInMonth = GetDatesOfSundays (System.DateTime.Now); et il donne une erreur Impossible de convertir implicitement le type 'chaîne' en 'System.Collections.Generic.IEnumerable ' :( –

Répondre

0

Vous pouvez aller pour DateTime[] ou IEnumerable<DateTime>.

Votre signature de la méthode devrait être

private IEnumerable<DateTime> GetDatesOfSundays(DateTime DatMonth) 

ou

private DateTime[] GetDatesOfSundays(DateTime DatMonth) 

Si vous havn't travaillé avec IEnumerable aller pour cette

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(); 
} 

et l'appeler comme

DateTime[] allSundaysInMonth = GetDatesOfSundays(System.DateTime.Now); 
+0

merci beaucoup! –

+0

Pourquoi retourner un tableau que vous venez de construire une liste? 'IList ' serait plus simple. – Jodrell

+0

Juste une autre question s'il vous plaît .. Je suis allé avec l'exemple ci-dessus, le retour lst.ToArray(); contient les informations correctes mais la ligne appelante: DateTime [] allSundaysInMonth = GetDatesOfSundays (System.DateTime.Now); n'est-ce pas, il n'y a rien dans toutSundaysInMonth? –

5

Que diriez-vous

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); 
    } 
} 

Je serais tenté de réécrire votre fonction comme une extension somthing comme celui-ci

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) 
    } 
} 

Ensuite, vous pouvez l'utiliser comme ceci

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

Si vous voulez convertir un IEnumerable<DateTime> à un string vous pouvez le faire,

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

utilisant thisstring.Join surcharge


Si vous voulez vraiment les jours comme DateTime[], vous pouvez le faire (mais il n'y a pas besoin)

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

ou pour mon exemple d'extension

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

oooo ok désolé je n'ai jamais travaillé avec IEnumerable..Je vois/comprends now..thanks! –

+0

@charlie_cat: Alors regarde ma réponse. –

+0

merci, je l'ai fait, j'essaierai les deux ... merci à tous! –

Questions connexes