Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq Distinct不按照论坛和Microsoft示例运行 使用系统; 使用System.Collections.Generic; 使用System.Linq; 使用NUnit.Framework; 名称空间UnitTest.Model { [测试夹具] 公共类SampleEquatableObjectTest { [测试] public void两个相同的lusercomparedeQualtrue() { var user1=newsampleobject{Id=1,Name=“Test User”}; var user2=newsampleobject{Id=1,Name=“Test User”}; Assert.IsTrue(user1.Equals(user2)); } [测试] public void两个不同的比较的QualFalse() { var user1=newsampleobject{Id=1,Name=“Test User 1”}; var user2=newsampleobject{Id=2,Name=“Test User 2”}; Assert.IsFalse(user1.Equals(user2)); } [测试] 公共无效集合FuserReturnsDistinctList() { var userList=新列表 { 新的SampleObject{Id=1,Name=“Test User”}, 新的SampleObject{Id=1,Name=“Test User 1”}, 新建SampleObject{Id=2,Name=“测试用户2”} }; aresequal(userList.Count,3); var result=userList.Distinct(); Assert.AreEqual(result.Count(),2); var multipleTest=(从结果组r中的r通过新的{r.Id}进入multGroup,其中multGroup.Count()>1选择multGroup.Key); Assert.IsFalse(多重测试); } 公共类SampleObject:IEquatable { 公共int Id{get;set;} 公共字符串名称{get;set;} 公共布尔等于(样本对象其他) { if(ReferenceEquals(this,other)) 返回true; if(ReferenceEquals(other,null)| | ReferenceEquals(this,null)) 返回false; 返回Id.Equals(其他Id); } } }_C#_Linq_Distinct - Fatal编程技术网

C# Linq Distinct不按照论坛和Microsoft示例运行 使用系统; 使用System.Collections.Generic; 使用System.Linq; 使用NUnit.Framework; 名称空间UnitTest.Model { [测试夹具] 公共类SampleEquatableObjectTest { [测试] public void两个相同的lusercomparedeQualtrue() { var user1=newsampleobject{Id=1,Name=“Test User”}; var user2=newsampleobject{Id=1,Name=“Test User”}; Assert.IsTrue(user1.Equals(user2)); } [测试] public void两个不同的比较的QualFalse() { var user1=newsampleobject{Id=1,Name=“Test User 1”}; var user2=newsampleobject{Id=2,Name=“Test User 2”}; Assert.IsFalse(user1.Equals(user2)); } [测试] 公共无效集合FuserReturnsDistinctList() { var userList=新列表 { 新的SampleObject{Id=1,Name=“Test User”}, 新的SampleObject{Id=1,Name=“Test User 1”}, 新建SampleObject{Id=2,Name=“测试用户2”} }; aresequal(userList.Count,3); var result=userList.Distinct(); Assert.AreEqual(result.Count(),2); var multipleTest=(从结果组r中的r通过新的{r.Id}进入multGroup,其中multGroup.Count()>1选择multGroup.Key); Assert.IsFalse(多重测试); } 公共类SampleObject:IEquatable { 公共int Id{get;set;} 公共字符串名称{get;set;} 公共布尔等于(样本对象其他) { if(ReferenceEquals(this,other)) 返回true; if(ReferenceEquals(other,null)| | ReferenceEquals(this,null)) 返回false; 返回Id.Equals(其他Id); } } }

C# Linq Distinct不按照论坛和Microsoft示例运行 使用系统; 使用System.Collections.Generic; 使用System.Linq; 使用NUnit.Framework; 名称空间UnitTest.Model { [测试夹具] 公共类SampleEquatableObjectTest { [测试] public void两个相同的lusercomparedeQualtrue() { var user1=newsampleobject{Id=1,Name=“Test User”}; var user2=newsampleobject{Id=1,Name=“Test User”}; Assert.IsTrue(user1.Equals(user2)); } [测试] public void两个不同的比较的QualFalse() { var user1=newsampleobject{Id=1,Name=“Test User 1”}; var user2=newsampleobject{Id=2,Name=“Test User 2”}; Assert.IsFalse(user1.Equals(user2)); } [测试] 公共无效集合FuserReturnsDistinctList() { var userList=新列表 { 新的SampleObject{Id=1,Name=“Test User”}, 新的SampleObject{Id=1,Name=“Test User 1”}, 新建SampleObject{Id=2,Name=“测试用户2”} }; aresequal(userList.Count,3); var result=userList.Distinct(); Assert.AreEqual(result.Count(),2); var multipleTest=(从结果组r中的r通过新的{r.Id}进入multGroup,其中multGroup.Count()>1选择multGroup.Key); Assert.IsFalse(多重测试); } 公共类SampleObject:IEquatable { 公共int Id{get;set;} 公共字符串名称{get;set;} 公共布尔等于(样本对象其他) { if(ReferenceEquals(this,other)) 返回true; if(ReferenceEquals(other,null)| | ReferenceEquals(this,null)) 返回false; 返回Id.Equals(其他Id); } } },c#,linq,distinct,C#,Linq,Distinct,} 此测试用例中的distinct方法不返回distinct列表。计数的断言将失败。我看了其他类似的问题和微软的例子,但它们看起来和我在测试中的代码一模一样。任何输入?您还需要重写对象类中的GetHashCode()和Equals方法。有关更多信息,请参阅此对应的 然后,您的测试将像预期的那样工作 using System; using System.Collections.Generic; using System.Linq; using NUnit.Framework; namespace

}


此测试用例中的distinct方法不返回distinct列表。计数的断言将失败。我看了其他类似的问题和微软的例子,但它们看起来和我在测试中的代码一模一样。任何输入?

您还需要重写对象类中的GetHashCode()和Equals方法。有关更多信息,请参阅此对应的

然后,您的测试将像预期的那样工作

using System;
using System.Collections.Generic;
using System.Linq;
using NUnit.Framework;

namespace UnitTest.Model
{
[TestFixture]
public class SampleEquatableObjectTest
{
    [Test]
    public void TwoIdenticalUsersComparedEqualTrue()
    {
        var user1 = new SampleObject { Id = 1, Name = "Test User" };
        var user2 = new SampleObject { Id = 1, Name = "Test User" };

        Assert.IsTrue(user1.Equals(user2));
    }

    [Test]
    public void TwoDifferentUsersComparedEqualFalse()
    {
        var user1 = new SampleObject { Id = 1, Name = "Test User 1" };
        var user2 = new SampleObject { Id = 2, Name = "Test User 2" };

        Assert.IsFalse(user1.Equals(user2));
    }

    [Test]
    public void CollectionOfUsersReturnsDistinctList()
    {
        var userList = new List<SampleObject>
                           {
                               new SampleObject {Id = 1, Name = "Test User"},
                               new SampleObject {Id = 1, Name = "Test User 1"},
                               new SampleObject {Id = 2, Name = "Test User 2"}
                           };

        Assert.AreEqual(userList.Count, 3);

        var result = userList.Distinct();

        Assert.AreEqual(result.Count(), 2);

        var multipleTest = (from r in result group r by new { r.Id } into multGroup where multGroup.Count() > 1 select multGroup.Key).Any();

        Assert.IsFalse(multipleTest);
    }

    public class SampleObject : IEquatable<SampleObject>
    {
        public int Id { get; set; }
        public string Name { get; set; }

        public bool Equals(SampleObject other)
        {
            if (ReferenceEquals(this, other))
                return true;
            if (ReferenceEquals(other, null) || ReferenceEquals(this, null))
                return false;

            return Id.Equals(other.Id);
        }
    }
}
public类SampleObject:IEquatable
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共布尔等于(样本对象其他)
{
if(ReferenceEquals(this,other))
返回true;
if(ReferenceEquals(other,null)| | ReferenceEquals(this,null))
返回false;
返回Id.Equals(其他Id);
}
公共覆盖int GetHashCode()
{
返回Id;
}
公共覆盖布尔等于(对象对象对象)
{
返回等于(obj作为SampleObject);
}
}

您正在实现一个接口,而没有根据接口规范定义两个成员。您的代码需要如下所示:

public class SampleObject : IEquatable<SampleObject>
{
    public int Id { get; set; }
    public string Name { get; set; }

    public bool Equals(SampleObject other)
    {
        if (ReferenceEquals(this, other))
            return true;
        if (ReferenceEquals(other, null) || ReferenceEquals(this, null))
            return false;

        return Id.Equals(other.Id);
    }

    public override int GetHashCode() 
    {
        return Id;
    }

    public override bool Equals(object obj) 
    {
        return Equals(obj as SampleObject);
    }
}

您确定正在调用.Equals方法,并且它没有使用==运算符吗?包含大部分相同的信息。GetHashCode不能依赖于名称,因为在确定相等性时不使用名称。对于任何两个相等的对象,GetHashCode必须返回相同的值。此外,obj.Id永远不会为null,因为它是一个int。为了完整性,可能还应该覆盖Object.Equals(在实现IEquatable之后)
    public bool Equals(SampleObject x, SampleObject y)
    {
        if (ReferenceEquals(x, y))
            return true;
        if (ReferenceEquals(x, null) || ReferenceEquals(y, null))
            return false;

        return x.Id.Equals(y.Id);
    }

    public int GetHashCode(SampleObject obj)
    {
               public int GetHashCode(SampleObject obj)
    {
        if (Object.ReferenceEquals(obj, null)) return 0;
        int hashId = obj.Id == null ? 0 : obj.Id.GetHashCode();
        int hashName = obj.Name == null ? 0 : obj.Name.GetHashCode();
        return hashId ^ hashName; // or what ever you want you hash to be, hashID would work just as well.
    }
    }