Я использую метод Enumerable.Union<TSource>
, чтобы получить объединение пользовательского списка1 с помощью Custom List2. Но почему-то это не работает, как должно быть в моем случае. Я получаю все предметы и дубликат один раз.Как использовать C# LINQ Union для получения Объединения пользовательского списка1 со списком2
Я следовал за MSDN Link, чтобы выполнить эту работу, но все же я не могу добиться того же.
Ниже приводится код пользовательского класса: -
public class CustomFormat : IEqualityComparer<CustomFormat>
{
private string mask;
public string Mask
{
get { return mask; }
set { mask = value; }
}
private int type;//0 for Default 1 for userdefined
public int Type
{
get { return type; }
set { type = value; }
}
public CustomFormat(string c_maskin, int c_type)
{
mask = c_maskin;
type = c_type;
}
public bool Equals(CustomFormat x, CustomFormat y)
{
if (ReferenceEquals(x, y)) return true;
//Check whether the products' properties are equal.
return x != null && y != null && x.Mask.Equals(y.Mask) && x.Type.Equals(y.Type);
}
public int GetHashCode(CustomFormat obj)
{
//Get hash code for the Name field if it is not null.
int hashProductName = obj.Mask == null ? 0 : obj.Mask.GetHashCode();
//Get hash code for the Code field.
int hashProductCode = obj.Type.GetHashCode();
//Calculate the hash code for the product.
return hashProductName^hashProductCode;
}
}
Это я называю следующим образом: -
List<CustomFormat> l1 = new List<CustomFormat>();
l1.Add(new CustomFormat("#",1));
l1.Add(new CustomFormat("##",1));
l1.Add(new CustomFormat("###",1));
l1.Add(new CustomFormat("####",1));
List<CustomFormat> l2 = new List<CustomFormat>();
l2.Add(new CustomFormat("#",1));
l2.Add(new CustomFormat("##",1));
l2.Add(new CustomFormat("###",1));
l2.Add(new CustomFormat("####",1));
l2.Add(new CustomFormat("## ###.0",1));
l1 = l1.Union(l2).ToList();
foreach(var l3 in l1)
{
Console.WriteLine(l3.Mask + " " + l3.Type);
}
Пожалуйста, предложите подходящий способ для достижения того же!
Кажется странным, но ваш код работает, если вы a) предоставляете конструктор без параметров для CustomFormat и передаете экземпляр этого класса в метод Union - см. Https://dotnetfiddle.net/YTVwTI. Тогда возникает вопрос, почему Union игнорирует реализацию IEqualityComparer внутри класса. –
stuartd