Używam metody Enumerable.Union<TSource>
do uzyskania unii listy niestandardowej1 z listą niestandardową2. Ale jakoś to nie działa tak, jak powinno w moim przypadku. Otrzymuję wszystkie przedmioty także duplikat jeden raz.Jak używać C# LINQ Union, aby uzyskać Unię niestandardowej listy1 z listą2
Poszedłem za MSDN Link, aby wykonać pracę, ale nadal nie jestem w stanie osiągnąć tego samego.
Poniżej przedstawiono kod klasy niestandardowego: -
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;
}
}
Ten Wołam w następujący sposób: -
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);
}
Proszę zaproponować odpowiedni sposób, aby osiągnąć to samo!
Wydaje się dziwne, ale twój kod działa, jeśli a) dostarczasz konstruktorowi bez parametrów dla CustomFormat i przekazujesz instancję tej klasy do metody Union - patrz https://dotnetfiddle.net/YTVwTI. Powstaje pytanie, dlaczego Unia ignoruje implementację klasy IEqualityComparer. –
stuartd