gpt4 book ai didi

c# - 在 C# 中查询字典的优雅方式

转载 作者:行者123 更新时间:2023-11-30 19:08:44 25 4
gpt4 key购买 nike

我正在尝试创建一种优雅且可扩展的方式来查询将枚举映射到一组字符串的字典。

所以我有这个类SearchFragments里面有字典。然后我想要一种方法,其中此类的消费者可以简单地询问“HasAny”,这就是我苦苦挣扎的地方,只需传入一些类似表达式的查询并返回 bool 值答案。

public class SearchFragments
{
private readonly IDictionary<SearchFragmentEnum, IEnumerable<string>> _fragments;

public SearchFragments()
{
_fragments = new Dictionary<SearchFragmentEnum, IEnumerable<string>>();
}

public bool HasAny(IEnumerable<SearchFragmentEnum> of)
{
int has = 0;
_fragments.ForEach(x => of.ForEach(y => has += x.Key == y ? 1 : 0));
return has >= 1;
}
}

目前这种方式的问题是,此类的消费者现在必须构造一个 IEnumerable<SearchFragmentEnum>这可能会非常困惑。

我正在寻找的是消费代码将能够按照以下方式编写内容:

searchFragments.HasAny(SearchFragmentEnum.Name, SearchFragmentEnum.PhoneNumber)

但是参数列表的大小可能会有所不同(我不必在 SearchFragments 类中为每种可能的组合编写方法重载(这样,如果将来有新值添加到 SearchFragmentEnum,我就不会不必更新类(class)。

最佳答案

您可以使用 params[]

public bool HasAny(params SearchFragmentEnum[] of)
{ ...

旁注:您知道 LIN(Q) 查询应该只查询一个源并且永远不会造成任何副作用吗?但是您的查询确实会不必要地增加整数:

_fragments.ForEach(x => of.ForEach(y => has += x.Key == y ? 1 : 0));

改为使用这个(它也更有效和更易读):

return _fragments.Keys.Intersect(of).Any();

一个更有效的替代方法是 Sergey's想法:

return of?.Any(_fragments.ContainsKey) == true; 

关于c# - 在 C# 中查询字典的优雅方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44722775/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com