在c#中,`list

如何指定自定义比较器进行去重?
当需要基于特定属性(如ID)而非整个对象来去重时,可以使用 `Distinct()` 的重载版本,传入一个 `IEqualityComparer

using System;
using System.Collections.Generic;
using System.Linq;
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
public override string ToString()
{
return $"Id: {Id}, Name: {Name}";
}
}
public class PersonIdComparer : IEqualityComparer<person>
{
public bool Equals(Person x, Person y)
{
if (x is null || y is null)
return false;
return x.Id == y.Id;
}
public int GetHashCode(Person obj)
{
return obj.Id.GetHashCode();
}
}
class Program
{
static void Main()
{
var people = new List<person>
{
new Person { Id = 1, Name = "Alice" },
new Person { Id = 2, Name = "Bob" },
new Person { Id = 1, Name = "Alice Duplicate" },
new Person { Id = 3, Name = "Charlie" }
};
Console.WriteLine("Before distinct:");
foreach (var p in people)
Console.WriteLine(p);
// 使用自定义比较器去重
var distinctPeople = people.Distinct(new PersonIdComparer()).ToList();
Console.WriteLine("\nAfter distinct with custom comparer:");
foreach (var p in distinctPeople)
Console.WriteLine(p);
}
}</person></person>
预期输出: Before distinct: Id: 1, Name: Alice Id: 2, Name: Bob Id: 1, Name: Alice Duplicate Id: 3, Name: Charlie After distinct with custom comparer: Id: 1, Name: Alice Id: 2, Name: Bob Id: 3, Name: Charlie
如果列表中包含null值,去重会如何处理?
`Distinct()` 方法会将 `null` 视为一个有效的值,并保留第一个出现的 `null`,后续重复的 `null` 会被移除。这意味着如果原列表中有多个 `null`,去重后只会剩下一个 `null`。这种行为符合 `IEquatable

using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static void Main()
{
var listWithNulls = new List<int>
{
1,
null,
2,
null,
3,
null
};
Console.WriteLine("Before distinct:");
foreach (var item in listWithNulls)
Console.WriteLine(item ?? "null");
var distinctList = listWithNulls.Distinct().ToList();
Console.WriteLine("\nAfter distinct:");
foreach (var item in distinctList)
Console.WriteLine(item ?? "null");
}
}</int>
预期输出: Before distinct: 1 null 2 null 3 null After distinct: 1 null 2 3
基于程序中某个输入、条件或结果的具体问题
在上述代码示例中,我们使用了 `Person` 类和 `PersonIdComparer` 来演示基于 ID 的去重。如果输入列表中存在多个具有相同 ID 但不同 Name 的对象,`Distinct()` 会保留第一个遇到的对象,并丢弃后续的重复项。这是由 `IEqualityComparer










