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)。

C# 字典搜索谓词作为方法参数

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