Метод Ienumerable Extension для вызовов массивов словарей

Я пытаюсь получить перечисляемую коллекцию из массива, содержащего словарь. Или я должен сказать, я пытаюсь написать метод расширения для своих объектов словаря, которые хранят массивы для возврата элемента IEnumerable, когда результат равен нулю.

Я использую словари для хранения массивов данных (для этого есть причины скорости), которые я извлекаю в определенных точках поиска. извлеченные данные используются в запросах Linq, соединениях и т. д., но у меня возникают проблемы, когда набор данных не существует.

Возврат пустого набора строк (0 штук) решит мою проблему. то, что у меня есть до сих пор, это (упрощенный код, конечно)

 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;
    }

// позже в коде есть что-то вроде:

dic.TryGetValue(1).Count()

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

То, что я пытаюсь достичь, - это общий метод расширения, как показано ниже:

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

Я продолжаю приближаться, но никогда не достигаю цели .... Я хотел бы, чтобы параметры метода расширения были простыми. Это прохождение T, которое продолжает меня ловить.

Если кто-то может помочь, пришлите мне свой отзыв.

Спасибо заранее!


person DubMan    schedule 12.10.2010    source источник


Ответы (1)


РЕДАКТИРОВАТЬ: осложнения с выводом типа.

Вот способ, идея состоит в том, чтобы ограничить тип словарных значений anIEnumerableof something.

К сожалению, вывод типа, похоже, не работает с этой сигнатурой (проверено с C # 3), поэтому вам придется явно указать общие аргументы.

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>;
}

Использование:

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"); // {   }

В качестве альтернативы мы могли бы использовать всего 2 общих параметра без каких-либо ограничений, но это сделает тип словаря менее гибким. В этом случае компилятор без проблем выведет общие аргументы.

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];
}
person Ani    schedule 12.10.2010
comment
Спасибо .... В конце концов я объединил некоторые ответы и создал эти методы расширения, которые, кажется, выполняют свою работу, спасибо за ваш вклад, включая Уинстона, поскольку я тоже использовал вашу идею: - person DubMan; 13.10.2010
comment
общедоступный статический IEnumerable ‹TValueType› TryGetValue ‹TValueType, Tkey, TValue› (этот IDictionary ‹Tkey, TValue› источник, Tkey ItemKey) {TValue foundList; if (source.TryGetValue (ItemKey, out foundList)) {return (IEnumerable ‹TValueType›) foundList; } return Enumerable.Empty ‹TValueType› (); } - person DubMan; 13.10.2010