Linq IEqualityComparer<string> 忽略大小写



我正在对元素列表进行排序:

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中的Namestring的列表:
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();

我希望这对你有帮助。

相关内容

  • 没有找到相关文章

最新更新