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

C#字典搜索谓词作为方法参数,c#,dictionary,lambda,where,anonymous,C#,Dictionary,Lambda,Where,Anonymous,我正在尝试创建一个函数,通过该函数,我可以传入一个函子/谓词,该函子/谓词可以插入字典的“Where”方法 (cardPool是“cardStats”类型的字典) 关于我想做的事: void CardStats findCard(Predicate<CardStats> pred) { return cardPool.Where(pred); } void CardStats findCard(谓词pred) { 返回cardPool.Where(pred); } 这段代

我正在尝试创建一个函数,通过该函数,我可以传入一个函子/谓词,该函子/谓词可以插入字典的“Where”方法

(cardPool是“cardStats”类型的字典) 关于我想做的事:

void CardStats findCard(Predicate<CardStats> pred)
{
    return cardPool.Where(pred);
}
void CardStats findCard(谓词pred)
{
返回cardPool.Where(pred);
}
这段代码显然不起作用,但只是我正在寻找的功能的一个粗略示例。 我在为列表设置这些内容时没有遇到任何问题,但对于一本字典来说,这确实让我感到困惑

任何帮助都会很好,谢谢

编辑:
啊,对不起,我应该提到更多:Cardstats是值,键的类型是int。我想筛选这些值(Cardstats)并测试它们的属性,如ID(int)或name(string)。

Dictionary
实现
IEnumerable
,因此它的
Where
扩展方法采用
Func
类型的谓词

您可以这样实现您的方法:

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

请注意,在字典上使用
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();
}
void IEnumerable findcard(Func pred)
{
返回cardPool.Where(kv=>pred(kv键,kv值))
.选择(kv=>kv.值);
}
void CardStats findCard(Func pred)
{
返回findCards(pred).FirstOrDefault();
}
Dictionary
实现了
IEnumerable
,因此它的
Where
扩展方法采用
Func
类型的谓词

您可以这样实现您的方法:

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

请注意,在字典上使用
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();
}
void IEnumerable findcard(Func pred)
{
返回cardPool.Where(kv=>pred(kv键,kv值))
.选择(kv=>kv.值);
}
void CardStats findCard(Func pred)
{
返回findCards(pred).FirstOrDefault();
}

我会使用FirstOrDefault作为第一条语句,因为它会在找到匹配元素后立即停止。另一件事是我会考虑使用别的东西而不是字典——因为当使用它时,如果它的索引目的,这种方式就是滥用。< /P> 无论如何,我将使用以下代码:

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;
}
public CardStats Find(Func谓词)
{
KeyValuePair kvCard=cardPool.FirstOrDefault(kvp=>predicate(kvp.Value));
if(kvCard.Equals(默认值(KeyValuePair)))
返回null;
返回kvCard.Value;
}

我会使用FirstOrDefault作为第一条语句,因为它会在找到匹配元素后立即停止。另一件事是我会考虑使用别的东西而不是字典——因为当使用它时,如果它的索引目的,这种方式就是滥用。< /P> 无论如何,我将使用以下代码:

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;
}
public CardStats Find(Func谓词)
{
KeyValuePair kvCard=cardPool.FirstOrDefault(kvp=>predicate(kvp.Value));
if(kvCard.Equals(默认值(KeyValuePair)))
返回null;
返回kvCard.Value;
}

字典有两个通用类型参数(键类型和值类型)。你的字典不能只有一种类型。
CardStats
是值类型还是键类型?听起来您可能只想使用
属性,然后像往常一样使用
其中
…字典有两个通用类型参数(键类型和值类型)。你的字典不能只有一种类型。
CardStats
是值类型还是键类型?听起来您可能只想使用
属性,然后像往常一样使用
Where
属性……啊,对不起,我应该提到更多:Cardstats是值,键的类型是int。我想筛选值(Cardstats)并测试它们的属性,如ID(int)或name(string)。“键值”重要的是要寻找。在大型字典中你需要考虑的性能。你也可以做CARTPOLL。在哪里(PRED)。pred@ChaturvediDewashish不能直接将
Func
传递给
Where()
方法,因为它需要
Func
。我选择在方法签名中使用前者,因为它允许编写lambda,如
(id,stat)=>id==5
,而不是
kv=>kv.Key==5
,其目的不太清楚。@JLRishe谢谢。接得好。事实上,我把它包装成了表情。它帮助我构建了复杂的谓词。啊,对不起,我应该提到更多:Cardstats是值,键是int类型。我想筛选这些值(Cardstats)并测试它们的属性,如ID(int)或name(string)。“key-value”很重要。在大型字典中你需要考虑的性能。你也可以做CARTPOLL。在哪里(PRED)。pred@ChaturvediDewashish不能直接将
Func
传递给
Where()
方法,因为它需要
Func
。我选择在方法签名中使用前者,因为它允许编写lambda,如
(id,stat)=>id==5
,而不是
kv=>kv.Key==5
,其目的不太清楚。@JLRishe谢谢。接得好。事实上,我把它包装成了表情。它帮助我构建了复杂的谓词。