【发布时间】:2019-03-17 03:05:13
【问题描述】:
我需要在字符串之间进行相交但比较子字符串:
public class MiNumeroEqualityComparer : IEqualityComparer<string> {
public bool Equals(string x, string y) => x.Contains(y);
public int GetHashCode(string obj) => obj.GetHashCode();
}
List<string> lst = new List<string> { "abcXdef", "abcXdef", "abcede", "aYcde" };
List<string> num = new List<string> { "X", "Y", "Z" };
var fin = lst.Intersect(num, new MiNumeroEqualityComparer());
我期望在 fin: "abcXdef", "abcXdef", "aYcde"
但它是空的,为什么?
首先我尝试了不区分大小写的子字符串:(也没有成功)
public bool Equals(string x, string y) => x.IndexOf(y, StringComparison.InvariantCultureIgnoreCase) >= 0;
但也是空的。
【问题讨论】:
-
X、Y、Z 是字符串而不是字符,可以是:XXX、Y、ZZZZZ
-
你的相等比较器一开始就坏了。您似乎正在尝试使用它来使“abcXdef”等于“X”,但您有很多问题。例如,首先,您的 equals 是不可逆的。所以
Equals(x,y)不会给出与Equals(y,x)相同的结果。您的 getHashCode 也是错误的,这可能是什么都没发生的原因。 “abcXdef”与“X”有不同的哈希码,所以它们不可能相同,所以它甚至可能没有运行你的 Equals 方法...... -
感谢您的评论,我已尝试 GetHashCode 全部返回 1,一些字符串在列表中但并非全部都应在列表中,我想 Linq 内部有一些优化,并非所有元素都检查 Equals功能。
-
我评论的重点不仅在于指出您的平等实施中的缺陷,而且还质疑它是否是正确的做事方式。 “x”和“abcXdef”在任何实际意义上都不相等,因此制作一个说它们相等的比较器是愚蠢的。假设对于相等比较器,如果 a=b 和 b=c 则 a =c 应该是正确的,如果一个字符串是另一个字符串的子字符串,则两个字符串相等,您最终将不得不证明所有字符串都等于每个字符串其他或多或少。
-
你说得对@Chris,谢谢!现在,我明白了。
标签: c# linq substring intersect iequalitycomparer