Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.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比较2个对象列表_C#_Linq - Fatal编程技术网

C# Linq比较2个对象列表

C# Linq比较2个对象列表,c#,linq,C#,Linq,我知道类似的问题已经通过了这个委员会,但我找不到一个能回答我问题的 我有2个列表和3个属性 班级: public int MeterID {get; set;} public string Datum { get; set; } public int NumberOfValues { get; set; } public myObject(int meterID, string datum, int numberOfValues) { t

我知道类似的问题已经通过了这个委员会,但我找不到一个能回答我问题的

我有2个
列表
和3个属性

班级:

    public int MeterID {get; set;}
    public string Datum { get; set; }
    public int NumberOfValues { get; set; }

    public myObject(int meterID, string datum, int numberOfValues)
    {
        this.ID= ID;
        this.Datum = datum;
        this.NumberOfValues = numberOfValues;
    }
我希望根据以下两个值比较这些列表
ID,Datum
,但我希望结果仍然是
列表
因此,当我的对象位于listA和listB中时,在执行以下linq语句后,它不应显示在
newList

var newList = ListA.Select(x => new { x.ID, x.Datum }).Except(ListB.Select(z => new { z.ID, z.Datum }));
该语句没有为我提供MyObject列表,而是提供了一个仅包含ID和数据的列表。我还需要ListA中的NumberOfValues属性位于新列表中


有没有办法用linq实现这一点?

我会这样做:

var result = ListA.Where(a => 
                ListB.All(b => b.ID != a.ID || b.Datum != a.Datum)).ToList();
这将获取
ListA
中的所有元素,其中
ListB
中的所有元素都是不同的(对于不同的定义)

如果您还想拥有
ListB
中不在
ListA
中的元素,您可以组合结果:

var result = ListA.Where(a => 
                ListB.All(b => b.ID != a.ID || b.Datum != a.Datum)).
                Concat(ListB.Where(b => 
                        ListA.All(a => b.ID != a.ID || b.Datum != a.Datum)).
             ToList();

我会这样做:

var result = ListA.Where(a => 
                ListB.All(b => b.ID != a.ID || b.Datum != a.Datum)).ToList();
这将获取
ListA
中的所有元素,其中
ListB
中的所有元素都是不同的(对于不同的定义)

如果您还想拥有
ListB
中不在
ListA
中的元素,您可以组合结果:

var result = ListA.Where(a => 
                ListB.All(b => b.ID != a.ID || b.Datum != a.Datum)).
                Concat(ListB.Where(b => 
                        ListA.All(a => b.ID != a.ID || b.Datum != a.Datum)).
             ToList();
另一个选项是与用于从
listB

public class MyObject
{
    public int MeterID { get; set; }
    public string Datum { get; set; }
    public int NumberOfValues { get; set; }

    public MyObject(int meterID, string datum, int numberOfValues)
    {
        this.MeterID = meterID;
        this.Datum = datum;
        this.NumberOfValues = numberOfValues;
    }
}

public class MyObjectEqualityComparer : EqualityComparer<MyObject>
{
    public override bool Equals(MyObject x, MyObject y)
    {
        return x.MeterID == y.MeterID
            && x.Datum == y.Datum;
    }

    public override int GetHashCode(MyObject obj)
    {
        return obj.MeterID ^ obj.Datum.GetHashCode();
    }
}
另一个选项是与用于从
listB

public class MyObject
{
    public int MeterID { get; set; }
    public string Datum { get; set; }
    public int NumberOfValues { get; set; }

    public MyObject(int meterID, string datum, int numberOfValues)
    {
        this.MeterID = meterID;
        this.Datum = datum;
        this.NumberOfValues = numberOfValues;
    }
}

public class MyObjectEqualityComparer : EqualityComparer<MyObject>
{
    public override bool Equals(MyObject x, MyObject y)
    {
        return x.MeterID == y.MeterID
            && x.Datum == y.Datum;
    }

    public override int GetHashCode(MyObject obj)
    {
        return obj.MeterID ^ obj.Datum.GetHashCode();
    }
}

为什么
Datum
String
而不是
DateTime
?为什么
Datum
String
而不是
DateTime
?看起来这正是我要找的。古玩:你为什么把点放在这行的末尾,而不是第二行?(exmpl:ListA.Where(x=>x>y)。[newline]FirstOrDefault()而不是ListA.Wjere(x=>x>y)[newline].FirstOrDefault。我认为与您的风格相比,该语句更清晰continues@Mafii就口味而言,我经常遇到格式化代码的问题,特别是长linq“一行程序”古玩:你为什么把点放在这行的末尾,而不是第二行?(exmpl:ListA.Where(x=>x>y)。[newline]FirstOrDefault()而不是ListA.Wjere(x=>x>y)[newline].FirstOrDefault.我认为与你的风格相比,它更清楚地表明continues@Mafii就口味而言,我经常遇到格式化代码的问题,特别是长linq“一行程序”。