Here\'s a simplified version of what I\'m trying to do:
var days = new Dictionary();
days.Add(1, \"Monday\");
days.Add(2, \"Tuesday\");
..
You can do this instead :
var days = new Dictionary<int?, string>(); // replace int by int?
days.Add(1, "Monday");
days.Add(2, "Tuesday");
...
days.Add(7, "Sunday");
var sampleText = "My favorite day of the week is 'xyz'";
var day = days.FirstOrDefault(x => sampleText.Contains(x.Value));
and then :
if (day.Key == null) {
System.Diagnotics.Debug.Write("Couldn't find day of week");
}
This is the most clear and concise way in my opinion:
var matchedDays = days.Where(x => sampleText.Contains(x.Value));
if (!matchedDays.Any())
{
// Nothing matched
}
else
{
// Get the first match
var day = matchedDays.First();
}
This completely gets around using weird default value stuff for structs.
FirstOrDefault
doesn't return null, it returns default(T).
You should check for:
var defaultDay = default(KeyValuePair<int, string>);
bool b = day.Equals(defaultDay);
From MSDN - Enumerable.FirstOrDefault<TSource>:
default(TSource) if source is empty; otherwise, the first element in source.
Notes:
.Equals
may be overridden or day
could be a null
.KeyValuePair<int, string> defaultDay = default;
, see Target-typed "default" literal.