2010-10-12 17 views
2

Je tente d'obtenir une collection numérisable à partir d'un tableau de dictionnaire. Ou devrais-je dire, j'essaye d'écrire une méthode d'extension pour mes objets de dictionnaire qui stockent des tableaux pour retourner un article IEnumerable quand le résultat est nul. Im utilisant des dictionnaires pour stocker des ensembles de données de tableau (il y a des raisons de vitesse pour cela), que j'extrais à certains points de recherche. les données extraites sont utilisées dans les requêtes Linq, les jointures etc. mais j'ai des problèmes quand un ensemble de données n'existe pas. Renvoyer un jeu de lignes vide (0 compte) résoudrait mon problème. ce que j'ai est jusqu'à présent ce (code simplifié ofcourse)Ienumerable Méthode d'extension pour les appels de tableaux de dictionnaire

public class Supplier 
{ 
    public string ID {get;set} 
    public string Name {get;set} 
} 

private sups[] = new Supplier[10]; 
Dictionary<int,Supplier[]> dic = new Dictionary<int, Supplier[]>(); 
     dic.Add(1,sups[]); 

public static IEnumerable<Supplier> TryGetValue<Tkey>(this IDictionary<Tkey, Supplier[]> source, Tkey ItemKey) 
    { 
     Supplier[] foundList; 
     IEnumerable<Supplier> retVal; 

     if (source.TryGetValue(ItemKey, out foundList)) 
      { 
       retVal = foundList.AsEnumerable(); 
      } 
      else 
      { 
       retVal = new Supplier[0].AsEnumerable(); 
      } 

     return retVal; 
    } 

// plus loin dans le code il y a quelque chose comme:

dic.TryGetValue(1).Count() 

//or a linq join 
from a in anothertable 
join d in dic.TryGetValue(1) on a.ID equals d.ID 

Quelle im essayant de acheive est une méthode d'extension générique comme ci-dessous :

public static IEnumerable<T> TryGetValue<Tkey,TValue>(this IDictionary<Tkey, TValue> source, Tkey ItemKey) 
{ 
    // same code... 
    // returning retVal = new T[0].AsEnumerable(); 
} 

Je continue de me rapprocher mais je ne suis jamais exactement là .... Je voudrais garder les paramètres de la méthode d'extension simples. C'est le passage de T qui ne cesse de m'attraper.

Si quelqu'un peut vous aider alors s'il vous plaît envoyez-moi votre feed back.

merci beaucoup d'avance!

+0

'Enumerable.Empty ()' –

Répondre

1

EDIT: Complications avec l'inférence de type.

Voici un moyen, l'idée est de contraindre le type de valeurs du dictionnaire à être IEnumerable de quelque chose.

Malheureusement, l'inférence de type ne semble pas fonctionner avec cette signature (testée avec C# 3), vous devrez donc spécifier explicitement les arguments génériques.

public static IEnumerable<TUnderlyingValue> GetValueOrEmpty<TKey, TUnderlyingValue, TValue> 
       (this IDictionary<TKey, TValue> source, TKey key) 
       where TValue : IEnumerable<TUnderlyingValue> 
{ 

    if(source == null) 
    throw new ArgumentNullException("source"); 

    TValue retVal; 

    return source.TryGetValue(key, out retVal) ? retVal : Enumerable.Empty<TUnderlyingValue>; 
} 

Utilisation:

var dict = new Dictionary<string, int[]> 
      { 
       { "foo", new[] { 6, 7, 8 } } 
       { "bar", new[] { 1 } } 
      }; 

var fooOrEmpty = dict.GetValueOrEmpty<string, int, int[]>("foo"); // { 6, 7, 8 } 
var barOrEmpty = dict.GetValueOrEmpty<string, int, int[]>("bar"); // { 1 } 
var bazOrEmpty = dict.GetValueOrEmpty<string, int, int[]>("baz"); // { } 

Sinon, nous pourrions utiliser seulement 2 paramètres génériques sans aucune contrainte, mais cela va rendre le type dictionnaire moins souple. Dans ce cas, le compilateur déduira les arguments génériques.

public static TUnderlyingValue[] GetValueOrEmpty<TKey, TUnderlyingValue> 
     (this IDictionary<TKey, TUnderlyingValue[]> source, TKey key)     
{ 

    if(source == null) 
    throw new ArgumentNullException("source"); 

    TUnderlyingValue[] retVal; 

    return source.TryGetValue(key, out retVal) ? retVal : new TUnderlyingValue[0]; 
} 
+0

Merci .... Je l'ai finalement combiné quelques réponses et ont construit ces méthodes d'extension qui semble faire le travail, je vous remercie de votre contribution tous, y compris Winston que je utilisé votre idée aussi: – DubMan

+0

public static IEnumerable TryGetValue (cette IDictionary source, Tkey ItemKey) { TValue foundList; si (source.TryGetValue (ItemKey, out foundList)) { return (IEnumerable ) foundList; } return Enumerable.Empty (); } – DubMan