12

This code is a simplified version of what I'm trying to do:

string day = Thursday;
DateTime dt = DateTime.Now;

if (day == dt.DayOfWeek)
{
     // start the program
}

I need to read a day of the week value from a database, assign it to a string, then compare the string to dt.DayOfWeek to check if the program should execute.

My error is this: "Operator '==' cannot be applied to operands of type 'string' and 'System.DayOfWeek"

Anyone know how to compare a string to a DateTime.DayOfWeek value?

rpax
  • 4,363
  • 7
  • 31
  • 55
Mick
  • 615
  • 2
  • 8
  • 14

4 Answers4

15

Use Enum.Parse to get the Enum value:

if ((DayOfWeek)Enum.Parse(typeof(DayOfWeek), day) == dt.DayOfWeek)

If you're not sure it's a valid value, there's TryParse<T>:

Enum val;
if (Enum.TryParse<DayOfWeek>(day, out val) && val == dt.DayOfWeek)
McGarnagle
  • 98,751
  • 30
  • 222
  • 258
13

Easiest is to convert enum to string:

if (day == dt.DayOfWeek.ToString())...

Notes:

  • if you can change type of day to DayOfWeek enum you can avoid string comparisons (and its related localization/comparison issues).
  • if you have to use string make sure to decide if case is important or not (i.e. should "thursday" be equal to DayOfWeek.Thursday) and use corresponding String.Equals method.
  • consider converting string to enum with Parse as suggested in other answers: ((DayOfWeek)Enum.Parse(typeof(DayOfWeek), day)
  • make sure incoming string is always English - if it could be in other languages you'll need to look into manually matching value to one provided in CultureInfo.DateTimeFormat.DayNames.
Alexei Levenkov
  • 96,782
  • 12
  • 124
  • 169
  • 1
    But is not a very good practice. It's better to check the equality with enums directy – rpax Mar 09 '14 at 23:49
3

Try DayOfWeek day = DayOfWeek.Thursday;

L.B
  • 110,417
  • 19
  • 170
  • 215
2

You can use Enum.TryParse<DayOfWeek>:

string strDay = "Wednesday";
DayOfWeek day;
if (Enum.TryParse<DayOfWeek>(strDay, out day)
    && day == DateTime.Today.DayOfWeek)
{
    // ...
}
Tim Schmelter
  • 429,027
  • 67
  • 649
  • 891