Linq IEqualityComparer<string> 忽略大小写
Linq IEqualityComparer<string> Ignore Case
我正在对元素列表进行排序:
var matchEle = listOfElements.Where(e => e.Properties().Any(p => p.Name.Contains("Key", Asking for IEqualityComparer))).First();
我习惯于直接使用 StringComparer、OrdinalIgnoreCase 或 CurrentCultureIgnoreCase,但是在这种情况下调用 Contains() 时,它要求使用 IEqualityComparer。我想是因为数据structure/level。我看到了如何设置 IEqualityComparer 的示例,例如
strEqualityComparer = new IEqualityComparer();
并为 strEqualityComparer 定义 class 但除此之外我不确定。有人可以帮助我让我的 linq 语句处理忽略大小写吗?
更新:
我很清楚这里是数据结构的示例:
listOfElements = [element1, element2, etc..]
element1.Properties = ["Prop1", "Key1", "Prop2", "Key2", etc.]
如果元素的任何属性具有包含关键字的值,我需要提取通过过滤器的元素,在本例中 "Key" 因此它不能是 .Equals 或 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
。将 Contains
替换为 Equals
,例如:
var matchEle = listOfElements
.Where(e => e.Properties().Any(p => p.Name.Equals("Key", StringComparison.OrdinalIgnoreCase)))
.First();
2 - 使用 IEqualityComparer
,如果 Name
in Properties
是 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();
希望对您有所帮助。
我正在对元素列表进行排序:
var matchEle = listOfElements.Where(e => e.Properties().Any(p => p.Name.Contains("Key", Asking for IEqualityComparer))).First();
我习惯于直接使用 StringComparer、OrdinalIgnoreCase 或 CurrentCultureIgnoreCase,但是在这种情况下调用 Contains() 时,它要求使用 IEqualityComparer。我想是因为数据structure/level。我看到了如何设置 IEqualityComparer 的示例,例如
strEqualityComparer = new IEqualityComparer();
并为 strEqualityComparer 定义 class 但除此之外我不确定。有人可以帮助我让我的 linq 语句处理忽略大小写吗?
更新: 我很清楚这里是数据结构的示例:
listOfElements = [element1, element2, etc..]
element1.Properties = ["Prop1", "Key1", "Prop2", "Key2", etc.]
如果元素的任何属性具有包含关键字的值,我需要提取通过过滤器的元素,在本例中 "Key" 因此它不能是 .Equals 或 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
。将 Contains
替换为 Equals
,例如:
var matchEle = listOfElements
.Where(e => e.Properties().Any(p => p.Name.Equals("Key", StringComparison.OrdinalIgnoreCase)))
.First();
2 - 使用 IEqualityComparer
,如果 Name
in Properties
是 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();
希望对您有所帮助。