new lista example array c# linq

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: