[英]C# List<Object>.Equals fails on object comparison
我有一个如下的课程。 我需要向此类的对象添加一种新语言,以防不存在
using System;
using System.Collections.Generic;
namespace discovery.POCO
{
public class MultiLingualObject
{
public string TableName { get; set; }
public string BranchId { get; set; }
public int GenericId { get; set; }
public string GenericCode { get; set; }
public List<MultiLingualColumn> MultiLingColumnsCollection = new List<MultiLingualColumn>();
}
public class MultiLingualColumn : IEquatable<MultiLingualColumn>
{
public string ColumnName { get; set; }
public string LanguageCode { get; set; }
public string LanguageText { get; set; }
public bool Equals(MultiLingualColumn other)
{
if (other == null) return false;
return string.Equals(ColumnName,other.ColumnName) &&
string.Equals(LanguageCode, other.LanguageCode) &&
string.Equals(LanguageText, other.LanguageText);
}
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
if (obj.GetType() != GetType()) return false;
return Equals(obj as MultiLingualColumn);
}
}
}
由于我是C#的新手,因此我搜索了各种解决方案,包括.Contains或Equal (在上面的Equal中添加了覆盖)。 我也知道我可以通过简单地使用where来实现比较。 但是,随着我可能在类中添加了更多元素,如果可能的话,我想坚持使用等于或包含。 我用来比较然后插入(如果不存在)的代码如下
internal void UpdateLocalMultiLing()
{
POCO.MultiLingualColumn _equals = new POCO.MultiLingualColumn()
{
ColumnName = InvoiceComment.Name.TrimEnd(),
LanguageCode = inputLanguage,
LanguageText = InvoiceComment.Value.TrimEnd()
};
if (!SupplierMultiLing.MultiLingColumnsCollection.Equals(_equals))
SupplierMultiLing.MultiLingColumnsCollection.Add(new POCO.MultiLingualColumn
{
ColumnName = InvoiceComment.Name.Trim(),
LanguageCode = inputLanguage,
LanguageText = InvoiceComment.Value.Trim()
}
);
}
但它会忽略条件,并再次添加相同的语言。 从所附图像可以看出。
请问我该如何解决?
您正在将列表与单个对象进行比较。 您需要.Contains()
而不是.Equals()
。
适当地实现IEquatable<T>
,或重写Equals(object)
和GetHashCode()
。 从什么Collection.Contains()检查现有对象? :
在您的自定义类上实现IEquatable,或重写Equals(和GetHashCode)
此代码显示“ True”:
public class Foo : IEquatable<Foo>
{
public string Bar { get; set; }
public bool Equals(Foo other)
{
return other.Bar == this.Bar;
}
}
public static void Main()
{
var list = new List<Foo>
{
new Foo { Bar = "Baz" }
};
Console.WriteLine(list.Contains(new Foo { Bar = "Baz" }));
}
但是,由于@Jeppe正确注释,建议还为其他收集和比较类型提供正确的GetHashCode()
实现。
您应该使用Contains()
方法。 另外,您应该为MultiLingualColumn
实现IEquatable
接口或实现IEqualityComparer
并将第二个参数传递给Contains()
。 我更喜欢第二种选择:
public class MultiLingualColumnComparer : IEqualityComparer<MultiLingualColumn>
{
public bool Equals(MultiLingualColumn x, MultiLingualColumn y)
{
//...
}
public int GetHashCode(MultiLingualColumn obj)
{
//...
}
}
接着:
if (!SupplierMultiLing.MultiLingColumnsCollection.Contains(_equals, new MultiLingualColumnComparer()))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.