我正在对元素列表进行排序:
var matchEle = listOfElements.Where(e => e.Properties().Any(p => p.Name.Contains("Key", Asking for IEqualityComparer))).First();
我习惯于直接使用StringComparer、OrdinalIgnoreCase或CurrentCultureIgnoreCases,但是在这种上下文中调用Contains((时,它要求使用IEqualityComparer。我想是因为数据结构/级别。我看到了一个如何建立像这样的IEqualityComparer的例子
strEqualityComparer = new IEqualityComparer();
以及为strEqualityComparer定义类,但除此之外我不确定。有人能帮我让linq语句处理一个忽略案例吗?
更新:我很清楚这里有一个数据结构的例子:
listOfElements = [element1, element2, etc..]
element1.Properties = ["Prop1", "Key1", "Prop2", "Key2", etc.]
如果它的任何属性有一个包含关键字的值,我需要提取通过过滤器的元素,在这种情况下是"Key",因此它不能。等于或IndexOf。
根据注释更新
在另一个string
:中搜索string
var matchEle = listOfElements
.Where(e => e.Properties().Any(p => p.Name.IndexOf("Key", System.StringComparison.OrdinalIgnoreCase) >= 0))
.First();
旧解决方案
您有两个选项,这取决于Name
类型:
1-不带IEqualityComparer
,以及Properties
中的Name
是否为string
。用Equals
替换Contains
,如
var matchEle = listOfElements
.Where(e => e.Properties().Any(p => p.Name.Equals("Key", StringComparison.OrdinalIgnoreCase)))
.First();
2-使用IEqualityComparer
,如果Properties
中的Name
是string
的列表:
2.1:创建自定义比较器,如:
public class StringIEqualityComparer : IEqualityComparer<string>
{
public bool Equals(string x, string y)
{
return x.Equals(y, StringComparison.OrdinalIgnoreCase);
}
public int GetHashCode(string obj)
{
return obj.GetHashCode();
}
}
2.2:将您的查询更改为:
var matchEle = listOfElements
.Where(e => e.Properties().Any(p => p.Name.Contains("Key", new StringIEqualityComparer())))
.First();
我希望这对你有帮助。