Linq IEqualityComparer<string> 忽略大小写

And*_*ard 9 linq iequalitycomparer stringcomparer

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

var matchEle = listOfElements.Where(e => e.Properties().Any(p => p.Name.Contains("Key", Asking for IEqualityComparer))).First();
Run Code Online (Sandbox Code Playgroud)

我习惯于直接使用 StringComparer、OrdinalIgnoreCase 或 CurrentCultureIgnoreCase,但是在这种情况下调用 Contains() 时,它会要求使用 IEqualityComparer。我想是因为数据结构/级别。我看到了如何设置 IEqualityComparer 的示例,例如

strEqualityComparer = new IEqualityComparer();
Run Code Online (Sandbox Code Playgroud)

并为 strEqualityComparer 定义类,但我不确定除此之外。有人可以帮助我让 linq 语句处理忽略案例吗?

更新:我很清楚这是数据结构的示例:

listOfElements = [element1, element2, etc..]
element1.Properties = ["Prop1", "Key1", "Prop2", "Key2", etc.]
Run Code Online (Sandbox Code Playgroud)

如果其任何属性具有包含关键字的值,我需要提取通过过滤器的元素,在本例中为“Key”,因此它不能是 .Equals 或 IndexOf。

Moh*_*jid 11

根据评论更新

string在另一个内部搜索string

var matchEle = listOfElements
.Where(e => e.Properties().Any(p => p.Name.IndexOf("Key", System.StringComparison.OrdinalIgnoreCase) >= 0))
.First();
Run Code Online (Sandbox Code Playgroud)

旧的解决方案

您有两个选项,具体取决于Name类型:
1 - Without IEqualityComparer,如果NameinProperties是 a string。替换ContainsEquals

var matchEle = listOfElements
    .Where(e => e.Properties().Any(p => p.Name.Equals("Key", StringComparison.OrdinalIgnoreCase)))
    .First();
Run Code Online (Sandbox Code Playgroud)

2 - With IEqualityComparer, and if NameinProperties是以下列表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();
    }
}
Run Code Online (Sandbox Code Playgroud)

2.2:将您的查询稍微更改为:

var matchEle = listOfElements
.Where(e => e.Properties().Any(p => p.Name.Contains("Key", new StringIEqualityComparer())))
.First();
Run Code Online (Sandbox Code Playgroud)

我希望这可以帮助你。

  • 请注意,此实现违反了在 HashSet 中使用的约定,因为相等的对象并不总是返回相等的哈希码。一种次优的修复方法是在 GetHashCode 中的“obj”上执行“ToLower”,以便考虑到不区分大小写的情况。对于 OP 用例来说,这不是一个问题,但如果其他人尝试在一般情况下使用它,则需要注意。 (2认同)