相交不在列表

时间:2017-03-30 09:48:50

标签: c# visual-studio equality

我有一个奇怪的问题。
我使用Visual Studio,我正在用C#开发一个项目。
我有两个自定义类" Attr"和" FD"我使用包含其对象的列表,例如

List<Attr> attrList = new List<Attr>();
List<FD> fdList = new List<FD>(); 

所以当我试图找到两个列表的交集时,结果不是我所期望的。为了使它更简单,我试图相交相似的对象,结果又错了。出了什么问题?

这是fd。它是FD类的一个对象。 this is the fd
这是ff,它也是FD类的对象。 this is ff

如您所见,这些对象包含完全相同的值。
方法 GetLeft()返回包含类Attr。

的对象的列表

所以当我试图找到这两个列表( fd.GetLeft() ff.GetLeft())之间的交集时,结果什么都没有(它应该是包含Attr对象的列表&#34; A&#34;)。 this is intersection

我错过了什么?

P.S。这些屏幕截图来自Visual Studio中的debugg模式。

2 个答案:

答案 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>
{
  ..
}

或者,您可以覆盖EqualsGetHashCode,因为这些方法将被称为默认IEqualityComparer

请参阅this answer,了解如何正确覆盖EqualsGetHashCode

相关问题