我正在使用Enumerable.Union<TSource>
方法獲取自定義List1與自定義List2的聯合。但不知何故,它不適用於我的情況。我得到所有的項目也重複一次。如何使用C#LINQ Union獲取自定義list1與列表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