c# - lista - ¿Cómo puedo asegurarme de que FirstOrDefault<KeyValuePair> haya devuelto un valor?
lista key value c# (3)
Esta es la forma más clara y concisa en mi opinión:
var matchedDays = days.Where(x => sampleText.Contains(x.Value));
if (!matchedDays.Any())
{
// Nothing matched
}
else
{
// Get the first match
var day = matchedDays.First();
}
Esto funciona completamente usando cosas de valores predeterminados extraños para las estructuras.
Aquí hay una versión simplificada de lo que estoy tratando de hacer:
var days = new Dictionary<int, string>();
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));
Como ''xyz'' no está presente en la variable KeyValuePair, el método FirstOrDefault no devolverá un valor válido. Quiero poder verificar esta situación, pero me doy cuenta de que no puedo comparar el resultado con "nulo" porque KeyValuePair es una estructura. El siguiente código no es válido:
if (day == null) {
System.Diagnotics.Debug.Write("Couldn''t find day of week");
}
Intentamos compilar el código, Visual Studio arroja el siguiente error:
Operator ''=='' cannot be applied to operands of type ''System.Collections.Generic.KeyValuePair<int,string>'' and ''<null>''
¿Cómo puedo verificar que FirstOrDefault haya devuelto un valor válido?
Usted puede hacer esto en su lugar:
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));
y entonces :
if (day.Key == null) {
System.Diagnotics.Debug.Write("Couldn''t find day of week");
}
FirstOrDefault
no devuelve null, devuelve el default(T)
.
Debe verificar:
var defaultDay = default(KeyValuePair<int, string>);
bool b = day.Equals(defaultDay);
De MSDN - Enumerable.FirstOrDefault<TSource>
:
predeterminado ( TSource ) si la fuente está vacía; de lo contrario, el primer elemento en la fuente .
Notas:
- Si su código es genérico, es mejor utilizar
EqualityComparer<T>.Default.Equals(day, defaultDay)
, porque.Equals
puede.Equals
o elday
podría sernull
. - En C # 7.1, podrás usar
var defaultDay = default;
, vea literal "predeterminado" escrito a máquina . - Ver también: Fuente de referencia -
FirstOrDefault