使用“;包含“;以查询列表<;键值>;在C#中

本文关键字:gt 键值 列表 包含 查询 使用 lt | 更新日期: 2023-09-27 18:26:30

在我的代码中,"sourceElements"是的一种类型

List<KeyValuePair<string, string>>.

我需要查询这个列表的键是否包含特定的值,我尝试了这个:

        sourceElements.Add(new KeyValuePair<string, string>("t","t"));
        sourceElements.Add(new KeyValuePair<string, string>("test", "test"));
        sourceElements.Add(new KeyValuePair<string, string>("t1", "t2"));
        if (sourceElements.All(x => x.Key.Contains("test", StringComparer.InvariantCultureIgnoreCase))
        {
             // do some stuff here
        }

但编译器报告称"无法根据用法推断类型参数"。

代码中有什么不正确的地方吗?

使用“;包含“;以查询列表<;键值>;在C#中

此代码应该是功能性的(在LINQPad中不会出现错误)

List<KeyValuePair<string, string>> sourceElements = new List<KeyValuePair<string, string>>();
sourceElements.Add(new KeyValuePair<string, string>("t","t"));
sourceElements.Add(new KeyValuePair<string, string>("test", "test"));
sourceElements.Add(new KeyValuePair<string, string>("t1", "t2"));
if (sourceElements.All(x => x.Key.ToLowerInvariant().Contains("test")))
{
    // do some stuff here
}

因此,如果用t和t1注释掉Keys,则if-块中的代码将执行

这里的问题是String上没有采用这些参数类型的方法ContainsContains只有一个重载,并且它只接受一个类型为String的参数。

我相信你正在寻找Index(string, StringComparison) 的方法

if (sourceElements.All(x => x.Key.IndexOf("test", StringComparison.InvariantCultureIgnoreCase) >= 0))

如果你想让原始代码工作,你可以添加一个扩展方法,让String看起来像是有这样一个重载。

bool Contains(this string str, string value, StringComparison comp) {
  return str.IndexOf(value, comp) >= 0;
}
static void Main(string[] args)
    {
        List<KeyValuePair<string, string>> sourceElements = new List<KeyValuePair<string, string>>();
        sourceElements.Add(new KeyValuePair<string, string>("t", "t"));
        sourceElements.Add(new KeyValuePair<string, string>("test", "test"));
        sourceElements.Add(new KeyValuePair<string, string>("t1", "t2"));
        if (sourceElements.All(x =>x.Key.Contains("test")))
        {
            // do some stuff here
        }
    }

if语句不应该是:吗

if(sourceElements.All(x => x.Key.ToLowerInvariant().Contains("test"))
{
     // do some stuff here
}

Contains将返回truefalse,而不是整数。

linq全算子的例子

所描述的解决方案很有用,但在我的情况下,我必须检查是否有任何一个元素包含键,而不是全部。所以我用了这个方法if(!lst.Any(x => x.Key.Contains("Internal"))){ lst.Add(new KeyValuePair<string, string>("Internal", "Internal"));}即.Any();因此它将检查整个列表是否存在该值