使用“;包含“;以查询列表<;键值>;在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
}
但编译器报告称"无法根据用法推断类型参数"。
代码中有什么不正确的地方吗?
此代码应该是功能性的(在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
上没有采用这些参数类型的方法Contains
。Contains
只有一个重载,并且它只接受一个类型为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
将返回true
或false
,而不是整数。
linq全算子的例子
所描述的解决方案很有用,但在我的情况下,我必须检查是否有任何一个元素包含键,而不是全部。所以我用了这个方法if(!lst.Any(x => x.Key.Contains("Internal"))){ lst.Add(new KeyValuePair<string, string>("Internal", "Internal"));}
即.Any();因此它将检查整个列表是否存在该值