C# 字典搜索谓词作为方法参数
本文关键字:方法 参数 谓词 字典 搜索 | 更新日期: 2023-09-27 18:35:19
我正在尝试创建一个函数,我可以在其中传递一个可以插入字典的"Where"方法的函子/谓词。
(cardPool 是 'cardStats' 类型的字典)我想做的伪
:void CardStats findCard(Predicate<CardStats> pred)
{
return cardPool.Where(pred);
}
这段代码显然不起作用,但只是我正在寻找的功能的一个粗略示例。我为列表设置它没有问题,但对于字典来说,它真的让我难倒了。
任何帮助都会很棒,谢谢!
编辑:啊,对不起,我应该多提一下:Cardstats 是值,键是 int 类型。我想筛选值(cardStats)并测试它们的属性,例如ID(int)或name(string)。
>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();
}
我会使用
FirstOrDefault 作为第一个语句,因为它会在找到匹配的元素时停止。 另一件事是我会考虑使用字典以外的其他东西 - 因为当以这种方式使用它时,如果它的索引目的,那就是滥用。
无论如何,这是我将使用的代码:
public CardStats Find(Func<CardStats, bool> predicate)
{
KeyValuePair<int, Roster> kvCard = cardPool.FirstOrDefault(kvp => predicate(kvp.Value));
if (kvCard.Equals(default(KeyValuePair<int, Roster>)))
return null;
return kvCard.Value;
}