2014-12-23 2 views
-1

Я пытаюсь создать функцию, посредством которой я могу передать функтор/предикат, который может сложить словарный метод «Где».C# Словарь поискового предиката как аргумент метода

(cardPool это словарь типа «cardStats») Псевдо того, что я хотел бы сделать:

void CardStats findCard(Predicate<CardStats> pred) 
{ 
    return cardPool.Where(pred); 
} 

Этот код, очевидно, не будет работать, но это просто грубый пример функциональности я ищу для. У меня не было проблем с настройкой этого списка для списков, но для словаря он действительно меня насторожил.

Любая помощь была бы замечательной, спасибо!

Редактировать: Ahh извините, я должен был упомянуть еще: Cardstats - это значение, ключ имеет тип int. Я хотел бы просеять значения (cardStats) и проверить их свойства, такие как ID (int) или имя (строка).

+0

Словари имеют два типовых типа (тип ключа и тип значения). В вашем словаре не может быть только одного типа. – JLRishe

+1

Ну что такое «CardStats» тип значения или тип ключа? Похоже, вы можете просто использовать свойство «Значения» или «Ключи», а затем использовать «Где», как обычно ... –

ответ

1

Dictionary<TKey, TValue> инвентарь IEnumerable<KeyValuePair<TKey, TValue>>, поэтому его метод расширения Where использует предикат типа Func<KeyValuePair<TKey, TValue>, bool>.

Вы могли бы реализовать свой метод так:

void CardStats findCard(Func<int, CardStats, bool> pred) 
{ 
    return cardPool.Where(kv => pred(kv.Key, kv.Value)) 
        .Select(kv => kv.Value) 
        .FirstOrDefault(); 
} 

И использовать его как это:

CardStats stats = myCards.findCard((id, stats) => id == 7); 

или

CardStats stats = myCards.findCard((id, stats) => stats.Name == "Ace of Clubs"); 

Обратите внимание, что при использовании Where на словарь не воспользуйтесь функциями быстрого поиска словаря и в основном рассматривают его как линейный сбор пар ключ-значение.


Еще один комментарий: Я предлагаю предоставить метод, который возвращает IEnumerable найденных карточек, если их несколько. Или вы можете предоставить тот, который делает это, и тот, который просто возвращает первое совпадение:

void IEnumerable<CardStats> findCards(Func<int, CardStats, bool> pred) 
{ 
    return cardPool.Where(kv => pred(kv.Key, kv.Value)) 
        .Select(kv => kv.Value); 
} 

void CardStats findCard(Func<int, CardStats, bool> pred) 
{ 
    return findCards(pred).FirstOrDefault(); 
} 
+0

Ahh sorry Я должен был упомянуть еще: Cardstats - это значение, ключ имеет тип внутр. Я хотел бы просеять значения (cardStats) и проверить их свойства, такие как ID (int) или name (string). – Dahlvash

+0

«ключевое значение» важно искать. Производительность, которую вы должны учитывать в большом словаре. –

+0

Вы также можете сделать cardPool.Where (pred) .ToList(), чтобы получить все значения, соответствующие pred –