C# 交集上的子字符串比较器

C# 交集上的子字符串比较器,c#,linq,substring,intersect,iequalitycomparer,C#,Linq,Substring,Intersect,Iequalitycomparer,我需要在字符串之间进行相交,但要比较子字符串: public class MiNumeroEqualityComparer : IEqualityComparer<string> { public bool Equals(string x, string y) => x.Contains(y); public int GetHashCode(string obj) => obj.GetHashCode(); } List<string> ls

我需要在字符串之间进行相交,但要比较子字符串:

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());

但是也是空的。

Intersect从两个集合中获取公共元素。这里的相交方法很优雅。它可以用于多种类型的元素

您的结果为空,因为它不是列表中的公共值

  List<string> lst = new List<string> { "abcXdef", "abcXdef", "abcede", "aYcde" };
            List<string> num = new List<string> { "X", "Y", "abcXdef", "Z", "aYcde" };

            var fin = lst.Intersect(num);
List lst=新列表{“abcXdef”、“abcXdef”、“abcede”、“aYcde”};
List num=新列表{“X”、“Y”、“abcXdef”、“Z”、“aYcde”};
var fin=第一个相交点(num);
fin>>abcXdef,aYcde


Intersect从2个集合中获取公共元素。这里的相交方法很优雅。它可以用于多种类型的元素

您的结果为空,因为它不是列表中的公共值

  List<string> lst = new List<string> { "abcXdef", "abcXdef", "abcede", "aYcde" };
            List<string> num = new List<string> { "X", "Y", "abcXdef", "Z", "aYcde" };

            var fin = lst.Intersect(num);
List lst=新列表{“abcXdef”、“abcXdef”、“abcede”、“aYcde”};
List num=新列表{“X”、“Y”、“abcXdef”、“Z”、“aYcde”};
var fin=第一个相交点(num);
fin>>abcXdef,aYcde


您正在两个列表之间进行交集,这将为您提供它们之间的公共项。由于两个列表都不包含相同的项,因此不会得到任何结果

如果要从
lst
中获取包含
num
中项目的所有项目,则可以执行类似以下代码的操作,该操作使用方法从lst中筛选项目:

var fin = lst.Where(item => num.Any(item.Contains));
结果:

{“abcXdef”、“abcXdef”、“aYcde”}

或者,如果确实要执行不区分大小写的查询,可以使用
IndexOf
方法:

var fin = lst.Where(item => num.Any(n => 
    item.IndexOf(n, StringComparison.OrdinalIgnoreCase) >= 0));

如果这很难理解(有时是Linq),那么上面的第一个代码段是编写以下内容的简写方式:

var fin = new List<string>();

foreach (var item in lst)
{
    foreach (var n in num)
    {
        if (item.Contains(n))
        {
            fin.Add(item);
            break;
        }
    }
}
var fin=new List();
foreach(lst中的var项目)
{
foreach(数值中的变量n)
{
如果(项目包含(n))
{
财务增加(项目);
打破
}
}
}

您正在两个列表之间进行交集,这将为您提供它们之间的公共项。由于两个列表都不包含相同的项,因此不会得到任何结果

如果要从
lst
中获取包含
num
中项目的所有项目,则可以执行类似以下代码的操作,该操作使用方法从lst中筛选项目:

var fin = lst.Where(item => num.Any(item.Contains));
结果:

{“abcXdef”、“abcXdef”、“aYcde”}

或者,如果确实要执行不区分大小写的查询,可以使用
IndexOf
方法:

var fin = lst.Where(item => num.Any(n => 
    item.IndexOf(n, StringComparison.OrdinalIgnoreCase) >= 0));

如果这很难理解(有时是Linq),那么上面的第一个代码段是编写以下内容的简写方式:

var fin = new List<string>();

foreach (var item in lst)
{
    foreach (var n in num)
    {
        if (item.Contains(n))
        {
            fin.Add(item);
            break;
        }
    }
}
var fin=new List();
foreach(lst中的var项目)
{
foreach(数值中的变量n)
{
如果(项目包含(n))
{
财务增加(项目);
打破
}
}
}

确保鲁弗斯在提供的答案中解决了您的问题。但让我解释一下为什么你的方法不起作用

它产生空结果的原因是永远不会调用
Equals(字符串x,字符串y)
。它可以从
GetHashCode
方法中推断出不等式。如果哈希值相同,那么它将调用
Equals
。换句话说,
Equals
中的逻辑永远不会执行

这里有一些代码,您可以看到发生了什么

class Program
{
    static void Main(string[] args)
    {
        // See I added an item at the end here to show when Equals is called
        List<string> lst = new List<string> { "abcXdef", "abcXdef", "abcede", "aYcde", "X" };
        List<string> num = new List<string> { "X", "Y", "Z" };

        var fin = lst.Intersect(num, new MiNumeroEqualityComparer()).ToList();
        Console.ReadLine();
    }
}

public class MiNumeroEqualityComparer : IEqualityComparer<string>
{
    public bool Equals(string x, string y)
    {
        Console.WriteLine("Equals called for {0} and {1}.", x, y);
        return x.Contains(y);
    }

    public int GetHashCode(string obj)
    {
        Console.WriteLine("GetHashCode alled for {0}.", obj);
        return obj.GetHashCode();
    }
}
类程序
{
静态void Main(字符串[]参数)
{
//请看,我在此处末尾添加了一项,以显示何时调用Equals
列表lst=新列表{“abcXdef”、“abcXdef”、“abcede”、“aYcde”、“X”};
List num=新列表{“X”、“Y”、“Z”};
var fin=lst.Intersect(num,new MiNumeroEqualityComparer()).ToList();
Console.ReadLine();
}
}
公共类分钟OeQualityComparer:IEqualityComparer
{
公共布尔等于(字符串x、字符串y)
{
WriteLine(“为{0}和{1}调用的相等值。”,x,y);
返回x.x(y);
}
public int GetHashCode(字符串obj)
{
WriteLine(“为{0}调用的GetHashCode”,obj);
返回obj.GetHashCode();
}
}
如果您运行上述代码,它将只为产生相同哈希的项调用
Equals
;所以只有“X”才是


请参阅中的输出。

确保鲁弗斯在提供的答案中解决了您的问题。但让我解释一下为什么你的方法不起作用

它产生空结果的原因是永远不会调用
Equals(字符串x,字符串y)
。它可以从
GetHashCode
方法中推断出不等式。如果哈希值相同,那么它将调用
Equals
。换句话说,
Equals
中的逻辑永远不会执行

这里有一些代码,您可以看到发生了什么

class Program
{
    static void Main(string[] args)
    {
        // See I added an item at the end here to show when Equals is called
        List<string> lst = new List<string> { "abcXdef", "abcXdef", "abcede", "aYcde", "X" };
        List<string> num = new List<string> { "X", "Y", "Z" };

        var fin = lst.Intersect(num, new MiNumeroEqualityComparer()).ToList();
        Console.ReadLine();
    }
}

public class MiNumeroEqualityComparer : IEqualityComparer<string>
{
    public bool Equals(string x, string y)
    {
        Console.WriteLine("Equals called for {0} and {1}.", x, y);
        return x.Contains(y);
    }

    public int GetHashCode(string obj)
    {
        Console.WriteLine("GetHashCode alled for {0}.", obj);
        return obj.GetHashCode();
    }
}
类程序
{
静态void Main(字符串[]参数)
{
//请看,我在此处末尾添加了一项,以显示何时调用Equals
列表lst=新列表{“abcXdef”、“abcXdef”、“abcede”、“aYcde”、“X”};
List num=新列表{“X”、“Y”、“Z”};
var fin=lst.Intersect(num,new MiNumeroEqualityComparer()).ToList();
Console.ReadLine();
}
}
公共类分钟OeQualityComparer:IEqualityComparer
{
公共布尔等于(字符串x、字符串y)
{
WriteLine(“为{0}和{1}调用的相等值。”,x,y);
返回x.x(y);
}
public int GetHashCode(字符串obj)
{
WriteLine(“为{0}调用的GetHashCode”,obj);
返回obj.GetHashCode();
}
}
如果您运行上述代码,它将只为产生相同哈希的项调用
Equals
;所以只有“X”才是


请参见中的输出。

X、Y、Z是字符串,而不是字符,可以是:XXX、Y、zzzzz您的相等比较器一开始就坏了。您似乎试图使用它使“abcXdef”等于“X”,但您有很多问题。比如说,首先,你的同龄人是不受尊敬的。所以
Equals(x,y)
不会给出与
Equals(y)相同的结果,