我有一个奇怪的问题。
我使用Visual Studio,我正在用C#开发一个项目。
我有两个自定义类" Attr"和" FD"我使用包含其对象的列表,例如
List<Attr> attrList = new List<Attr>();
List<FD> fdList = new List<FD>();
所以当我试图找到两个列表的交集时,结果不是我所期望的。为了使它更简单,我试图相交相似的对象,结果又错了。出了什么问题?
这是fd。它是FD类的一个对象。
这是ff,它也是FD类的对象。
如您所见,这些对象包含完全相同的值。
方法 GetLeft()返回包含类Attr。
所以当我试图找到这两个列表( fd.GetLeft()和 ff.GetLeft())之间的交集时,结果什么都没有(它应该是包含Attr对象的列表&#34; A&#34;)。
我错过了什么?
P.S。这些屏幕截图来自Visual Studio中的debugg模式。
答案 0 :(得分:2)
为了使用 [TestMethod]
[TestCategory("Verification")]
public void GetLastTextElement_TextEndsWithSurrogatePair_GetsSurrogatePair()
{
// Arrange
const string OsmanyaDigitOne = "\U000104A1";
const string OsmanyaDigitTwo = "\U000104A2";
const string Target = "abc" + OsmanyaDigitOne + "de" + OsmanyaDigitTwo;
// Act
int length = Target.Length;
string lastSubstring = Target.Substring(length - 1);
StringInfo stringInfo = new StringInfo(Target);
int lengthInTextElements = stringInfo.LengthInTextElements;
string lastTextElement = stringInfo.SubstringByTextElements(lengthInTextElements - 1);
string lastTextElementInOneExpression = Target.Substring(StringInfo.ParseCombiningCharacters(Target).Last());
// Assert
Assert.AreEqual(9, length, @"Wrong length");
Assert.AreNotEqual(OsmanyaDigitTwo, lastSubstring, @"Unexpectedly got last text element");
Assert.AreEqual(7, lengthInTextElements, @"Wrong length in text elements");
Assert.AreEqual(OsmanyaDigitTwo, lastTextElement, @"Wrong last text element");
Assert.AreEqual(OsmanyaDigitTwo, lastTextElementInOneExpression, @"Wrong last text element");
}
我建议实施Intersect
,如下所示:
IEqualityComparer<T>
而public class FD
{
public string Name { get; set; }
}
static void Main()
{
List<FD> fdList1 = new List<FD>();
fdList1.Add(new FD { Name = "a" });
List<FD> fdList2 = new List<FD>();
fdList2.Add(new FD { Name = "a" });
IEnumerable<FD> fd = fdList1.Intersect<FD>(fdList2, new ComparerFd()).ToList();
}
应该是这样的:
CamparerFd
答案 1 :(得分:2)
如果您创建了自己的类,并且未覆盖该类中的Equals
- 方法,则Intersect
- 方法将仅比较对象的引用,而不是属性。
采取以下,非常简单的课程:
class MyClass
{
int Value { get; set; }
public MyClass(int value)
{
this.Value = value;
}
}
现在,创建两个列表,两个列表都包含一个对象。对象的属性相同,但实例不是:
var list1 = new List<MyClass>
{
new MyClass(5)
};
var list2 = new List<MyClass>
{
new MyClass(5)
};
所以会发生以下情况:
list1[0].Equals(list2[0]); // false
list1.Intersect(list2); // No matches
如果您希望这些方法比较MyClass
- 对象的属性,请实施IEqualityComparer<MyClass>
,例如将类签名更改为:
class MyClass : IEqualityComparer<MyClass>
{
..
}
或者,您可以覆盖Equals
和GetHashCode
,因为这些方法将被称为默认IEqualityComparer
。
请参阅this answer,了解如何正确覆盖Equals
和GetHashCode
。