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)相同的结果,