Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.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# 方法返回错误的结果_C#_Sql_Except - Fatal编程技术网

C# 方法返回错误的结果

C# 方法返回错误的结果,c#,sql,except,C#,Sql,Except,我试着比较两个类型结果列表,它总是只返回整个结果列表,似乎没有过滤掉任何东西 代码如下: List<Results> Veranderingen = resultaten2.Except(resultaten).ToList(); foreach(Results x in Veranderingen) { MessageBox.Show("Nieuwe Data gevonden: " + x.titel + "Van d

我试着比较两个类型结果列表,它总是只返回整个结果列表,似乎没有过滤掉任何东西

代码如下:

  List<Results> Veranderingen = resultaten2.Except(resultaten).ToList();

        foreach(Results x in Veranderingen)
        {
            MessageBox.Show("Nieuwe Data gevonden: " + x.titel + "Van de website" + x.url + "");
        }

我认为我在Exception方法的语法中犯了一些错误,有人能帮我吗?

有两种方法可以比较两个
结果
对象(以及通常的所有引用类型对象):

  • 第一种方法是比较两个
    结果
    对象的属性值

  • 第二种方法是比较引用本身。我的意思是,如果两个
    结果
    对象实际上是一个对象,但有两个引用,那么它们是相等的。例如,您可以创建一个
    Results
    对象并将其放在两个列表中

两个列表中的对象显然是不同的对象,因此我猜您希望使用第一种比较方法

默认情况下,C#中引用类型对象的相等性检查属于第二种类型。但是,如果需要,可以重写此行为

重写此行为的一种方法是重写类中的
Equals
GetHashCode
方法。以下是一个例子:

public class Results
{
    public string url { get; set; }
    public string title { get; set; }

    public override bool Equals(object obj)
    {
        Results other = obj as Results;

        if (other == null)
            return false;

        return other.url == this.url && other.title == this.title;
    }

    public override int GetHashCode()
    {
        return new {url, title}.GetHashCode();
    }
}

通过这种方式,我们告诉系统应该如何测试这种类型对象的相等性。

我相信Yacoub的答案会起作用,并且在大多数情况下可能是首选的解决方案,但是如果您不能修改Results类,这里有另一种方法。为结果定义IEqualityComparer的实现,然后将其作为Except方法的第二个参数传递。 编辑:

课程结果{
公共字符串名{get;set;}
公共字符串LastName{get;set;}
}
类结果QualityComparer:IEqualityComparer{
公共布尔等于(结果res1,结果res2){
返回(res1.FirstName==res2.FirstName&&res1.LastName==res2.LastName);
}
public int GetHashCode(Results res){
返回新的{res.FirstName,res.LastName}.GetHashCode();
}
}
//下面是将结果比较程序传递给Except的代码示例:

        var resultaten = new List<Results>() {
        new Results() {FirstName="Bob", LastName="Smith"},
        new Results() {FirstName="Ted", LastName="Wilson"},
        new Results() {FirstName="Alice", LastName="Wilson"},
        new Results() {FirstName="Carol", LastName="Smith"}
        };

        var resultaten2 = new List<Results>() {
        new Results() {FirstName="William", LastName="Smith"},
        new Results() {FirstName="Ted", LastName="Wilson"},
        new Results() {FirstName="Gerhardt", LastName="Wilson"},
        new Results() {FirstName="Carol", LastName="Smith"}
        };

        var comparer = new ResultsEqualityComparer();

        List<Results> Veranderingen = resultaten2.Except(resultaten, comparer).ToList();

        foreach (var x in Veranderingen) {
            Console.WriteLine(x.FirstName + " " + x.LastName);
        }
var resultaten=新列表(){
新结果(){FirstName=“Bob”,LastName=“Smith”},
新结果(){FirstName=“Ted”,LastName=“Wilson”},
新结果(){FirstName=“Alice”,LastName=“Wilson”},
新结果(){FirstName=“Carol”,LastName=“Smith”}
};
var resultaten2=新列表(){
新结果(){FirstName=“William”,LastName=“Smith”},
新结果(){FirstName=“Ted”,LastName=“Wilson”},
新结果(){FirstName=“Gerhardt”,LastName=“Wilson”},
新结果(){FirstName=“Carol”,LastName=“Smith”}
};
var comparer=new ResultsEqualityComparer();
List Veranderingen=resultaten2.Except(resultaten,comparer.ToList();
foreach(Veranderingen中的var x){
Console.WriteLine(x.FirstName+“”+x.LastName);
}
//打印出: 威廉·史密斯
Gerhardt Wilson

您能显示
结果
课程吗?它是否定义了
Equals
GetHashCode
?Results类只不过是一个具有两个属性的类,用于存储数据,我不知道Equals和GetHashCode是做什么的,因此我没有在类中定义它们。如果resultaten2的任何元素也不在resultaten中,然后,Except方法将返回resultaten2的全部内容。如果Resultaten和resultaten2之间的10个元素中有9个相同,则它仍然返回resultaten2的全部内容,只有一个参数,但使用默认比较器的情况除外,该比较器显然不起作用。因此,您可能需要传递一个IEqualityComparer对象作为第二个参数来告诉它如何比较结果。非常感谢!它现在只显示了我想要的两个值之间的不同项:)是的,Yacoub的答案有效,但也非常感谢你的帮助,我明天会尝试这个,只是为了测试,因为它可能会在以后有用!非常感谢,非常好。我只是为可能需要的人添加了更完整的示例代码。
class Results {
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

class ResultsEqualityComparer : IEqualityComparer<Results> {

    public bool Equals(Results res1, Results res2) {
        return (res1.FirstName == res2.FirstName && res1.LastName == res2.LastName);
    }

    public int GetHashCode(Results res) {
        return new { res.FirstName, res.LastName }.GetHashCode();
    }

}
        var resultaten = new List<Results>() {
        new Results() {FirstName="Bob", LastName="Smith"},
        new Results() {FirstName="Ted", LastName="Wilson"},
        new Results() {FirstName="Alice", LastName="Wilson"},
        new Results() {FirstName="Carol", LastName="Smith"}
        };

        var resultaten2 = new List<Results>() {
        new Results() {FirstName="William", LastName="Smith"},
        new Results() {FirstName="Ted", LastName="Wilson"},
        new Results() {FirstName="Gerhardt", LastName="Wilson"},
        new Results() {FirstName="Carol", LastName="Smith"}
        };

        var comparer = new ResultsEqualityComparer();

        List<Results> Veranderingen = resultaten2.Except(resultaten, comparer).ToList();

        foreach (var x in Veranderingen) {
            Console.WriteLine(x.FirstName + " " + x.LastName);
        }