Tengo un método que devuelve ILookup
. En algunos casos, quiero devolver un ILookup
vacío como una salida anticipada. ¿Cuál es la mejor manera de construir un ILookup
vacío?Empty ILookup <K, T>
Respuesta
Además de las respuestas de mquander y Vasile Bujac, puede crear una clase de EmptyLookup<K,E>
sencilla, simple y simple como sigue. (En mi opinión, hay no parece mucho beneficio para la creación de un ILookup<K,E>
aplicación plena de acuerdo con la respuesta de Vasile.)
var empty = EmptyLookup<int, string>.Instance;
// ...
public static class EmptyLookup<TKey, TElement>
{
private static readonly ILookup<TKey, TElement> _instance
= Enumerable.Empty<TElement>().ToLookup(x => default(TKey));
public static ILookup<TKey, TElement> Instance
{
get { return _instance; }
}
}
Gracias a mquander y Vasile pero creo que esta fusión de las dos soluciones es la más simple/mejor. –
Usted puede volver nula
o excepción
Pero debe tener en cuenta que en el comentario de la clase
Agregado: + Esto es más evidente que algún método de extensión
Estoy totalmente en desacuerdo. Si una función devuelve un mapa de búsqueda de algunos 'K's a' T's, y sucede que no hay 'K's o' T's, es obvio que la función debe devolver una búsqueda vacía. No tiene sentido devolver nulo o lanzar una excepción, y de repente tener que buscarlo en todas partes, cuando hubiera salido de la caja si hubiera devuelto una búsqueda vacía. – mquander
"ILookup como salida anticipada": este es un caso típico en el que debe lanzar una excepción. –
Si coloca la excepción de comentario abreviado, todos los demás desarrolladores lo ven con estilo. Y procesa esa excepción. –
No hay Built-in , entonces solo escribiría un método de extensión que ejecute algo similar a new T[0].ToLookup<K, T>(x => default(K));
I es muy dudoso que devolver nulo sería más correcto aquí. Casi nunca se da el caso de que desee devolver el valor nulo de un método que devuelve una colección (a diferencia de una colección vacía). No podría estar más en desacuerdo con las personas que sugieren eso.
Se debe considerar la semántica del valor de retorno. Por ejemplo, una búsqueda que no devuelve resultados debe devolver una colección vacía, pero una búsqueda que ha fallado (por ejemplo) o que tenía parámetros no válidos debería devolver 'null'. –
Bueno, una búsqueda que tiene parámetros no válidos (como en, argumentos inválidos para un método, supongo) probablemente debería arrojar. Pero entiendo tu significado. Sin embargo, es muy común que un método devuelva una colección vacía, y sería un desastre devolver nulo en ese caso. – mquander
Usted es de hecho correcto con respecto a tirar al error. Sin embargo, he trabajado con aplicaciones comerciales donde, por ejemplo, ciertos sistemas externos no estarían disponibles durante ciertas horas del día; en tales casos, las consultas y las solicitudes fallarían, pero no es un caso "excepcional", ya que era el comportamiento esperado. –
Puede crear una clase singleton para búsquedas vacías.
public sealed class EmptyLookup<T, K> : ILookup<T, K>
{
private static readonly EmptyLookup<T, K> _instance
= new EmptyLookup<T, K>();
public static EmptyLookup<T, K> Instance
{
get { return _instance; }
}
private EmptyLookup() { }
public bool Contains(T key)
{
return false;
}
public int Count
{
get { return 0; }
}
public IEnumerable<K> this[T key]
{
get { return Enumerable.Empty<K>(); }
}
public IEnumerator<IGrouping<T, K>> GetEnumerator()
{
yield break;
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
yield break;
}
}
entonces se puede escribir código como este:
var x = EmptyLookup<int, int>.Instance;
La ventaja de crear una nueva clase es que se puede utilizar el "es" operador y comprobar el tipo de igualdad:
if (x is EmptyLookup<,>) {
// ....
}
Cree una lista vacía, luego ejecute ToLookup() en ella, como este:
List<Point> items = new List<Point>();
ILookup<int, int> lookup = items.ToLookup(p => p.X, p => p.Y);
¡Buena suerte!
O algo más en el espíritu de LINQ:
public static class Utility
{
public static ILookup<TKey, TElement> EmptyLookup<TKey, TElement>(Func<TKey, TKey> keySelector,
Func<TKey, TElement> elementSelector)
{
return Enumerable.Empty<TKey>().ToLookup(keySelector, elementSelector);
}
}
¿Por qué molestarse en tomar los funcs de los selectores? –
- 1. ¿Por qué Enumerable.ToLookup <>() devuelve un ILookup <,> y no una búsqueda <,>?
- 2. ILookup interface vs IDictionary
- 3. ILookup versus IGrouping
- 4. C#: ¿Cómo puede Dictionary <K,V> implementar ICollection <KeyValuePair <K,V>> sin tener Add (KeyValuePair <K,V>)?
- 5. ILookup <TKey, TVal> vs. IGrouping <TKey, TVal>
- 6. La comprensión HashMap <K,V>
- 7. ¿Qué es LinkedHashMap <k, v>?
- 8. HtmlPage.Document.Cookies empty
- 9. Java Map <K,V>: ¿Por qué get (object) not get (K)?
- 10. ¿Hay alguna forma de aplanar .Net ILookup <TKey, TElement> en una lista <TElement>?
- 11. SQLite select where empty?
- 12. Empty responseText from XMLHttpRequest
- 13. WPF listbox empty datatemplate
- 14. PHP empty var == 0?
- 15. jQuery empty() vs remove()
- 16. os.path.dirname (__ file__) returns empty
- 17. Diccionario más eficiente <K,V> .ToString() con formato?
- 18. Binary Search on Keys of SortedList <K, V>
- 19. Convertir un POJO a un mapa <K,V>
- 20. Volcar Java HashMap <K,V> a XML y
- 21. errores extensión de tipo de diccionario <'K, 'V>
- 22. Cómo crear un tipo que implementan IDictionary <'K, 'V> y IEnumerable <'V>
- 23. Twig Empty Variable -> Exception?
- 24. <c: if test = '$ {not empty "$ {records}"}'> nunca evalúa falso
- 25. BASH: diferencia entre "exportación k = 1" frente a "k = 1"
- 26. ¿Deberíamos usar k-means ++ en lugar de k-means?
- 27. WPF Listbox - Empty List Display Message
- 28. Usando operator [] en empty std :: vector
- 29. LINQ intersect, multiple lists, some empty
- 30. Diferencia entre .nil ?, .blank? y .empty?
¿Qué tipo es usted usando como K y T en su ILookup? –