Linq利用Distinct去除重复项问题(可自己指定)
在Linq中,我们可以使用Distinct方法来去除重复项。但是默认情况下,Distinct方法只能去除基本数据类型的重复项,在处理对象时会遇到一些问题。下面我们来详细讲解如何使用Linq的Distinct方法去除重复项,同时解决对象去重的问题。
1. 基本类型的Distinct去重
对于基本数据类型的去重,我们可以简单地使用Distinct方法去重。以下是一个使用Distinct方法去重整数列表的示例:
List<int> numbers = new List<int> { 1, 2, 3, 2, 4, 3 };
var distinctNumbers = numbers.Distinct();
foreach (var number in distinctNumbers)
{
Console.WriteLine(number);
}
运行结果为:
1
2
3
4
2. 对象的Distinct去重
对于对象的去重,我们需要实现IEqualityComparer接口来定义对象比较的规则。然后将该接口的实例传递给Distinct方法进行对象去重。以下是一个使用IEqualityComparer接口去重Person对象列表的示例:
class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
class PersonComparer : IEqualityComparer<Person>
{
public bool Equals(Person x, Person y)
{
if (x == null && y == null)
{
return true;
}
else if (x == null || y == null)
{
return false;
}
else if (x.Name == y.Name && x.Age == y.Age)
{
return true;
}
else
{
return false;
}
}
public int GetHashCode(Person obj)
{
int hashName = obj.Name == null ? 0 : obj.Name.GetHashCode();
int hashAge = obj.Age.GetHashCode();
return hashName ^ hashAge;
}
}
List<Person> persons = new List<Person>
{
new Person{ Name = "Tom", Age = 18 },
new Person{ Name = "Jerry", Age = 20 },
new Person{ Name = "Tom", Age = 18 }
};
var distinctPersons = persons.Distinct(new PersonComparer());
foreach (var person in distinctPersons)
{
Console.WriteLine("{0}, {1}", person.Name, person.Age);
}
运行结果为:
Tom, 18
Jerry, 20
在示例中,我们定义了PersonComparer类实现了IEqualityComparer
3. 自定义规则的Distinct去重
在一些场景下,我们需要自定义规则来指定对象的比较规则。例如,对于一个字符串列表,我们可能希望只去除前n个字符相同的字符串。以下是一个使用自定义规则去重字符串列表的示例:
class StringComparer : IEqualityComparer<string>
{
private int _prefixLength;
public StringComparer(int prefixLength)
{
_prefixLength = prefixLength;
}
public bool Equals(string x, string y)
{
if (x == null && y == null)
{
return true;
}
else if (x == null || y == null)
{
return false;
}
else if (x.Substring(0, _prefixLength) == y.Substring(0, _prefixLength))
{
return true;
}
else
{
return false;
}
}
public int GetHashCode(string obj)
{
int hashPrefix = obj.Substring(0, _prefixLength).GetHashCode();
return hashPrefix;
}
}
List<string> strings = new List<string> { "abc1", "abc2", "abcd1", "abcd2", "xyz1", "xyz2" };
var distinctStrings = strings.Distinct(new StringComparer(3));
foreach (var str in distinctStrings)
{
Console.WriteLine(str);
}
运行结果为:
abc1
abcd1
xyz1
在示例中,我们定义了StringComparer类实现了IEqualityComparer
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Linq利用Distinct去除重复项问题(可自己指定) - Python技术站