C# 使用LINQ。如何比较两个简单列表以给出新列表和旧列表中的另一个对象列表?

C# 使用LINQ。如何比较两个简单列表以给出新列表和旧列表中的另一个对象列表?,c#,linq,C#,Linq,我有两个IList类型的对象: public class SampleSentence { public int SampleSentenceId { get; set; } public string Text { get; set; } } IList<SampleSentence> Old = [new SampleSentence() { SampleSentenceId = 1; Text = 'cat' }] IList<Sample

我有两个IList类型的对象:

public class SampleSentence
{
    public int SampleSentenceId { get; set; } 
    public string Text { get; set; } 
}

IList<SampleSentence> Old = 
   [new SampleSentence() { SampleSentenceId = 1; Text = 'cat' }]

IList<SampleSentence> New = 
   [new SampleSentence() { Text = 'cat' }],
    new SampleSentence() { Text = 'dog' }]
公共类示例
{
公共int-SampleSentenceId{get;set;}
公共字符串文本{get;set;}
}
IList Old=
[新SampleSentence(){SampleSentenceId=1;Text='cat'}]
IList新=
[new SampleSentence(){Text='cat'}],
new SampleSentence(){Text='dog'}]
我需要得到的是:

IList<SampleSentence> whatINeed = 
   [new SampleSentence() { Text = 'dog' }]
IList whatINeed=
[new SampleSentence(){Text='dog'}]
  • Object
    Old
    是一个包含SampleSentenceId和文本字段的SampleSentence列表
  • Object
    New
    是一个样本列表,其中只填充了文本字段。它的行数将与object
    Old

使用LINQ,我如何比较
旧的
新的
对象(将它们与文本内容链接),并创建另一个IList,该IList在列表中具有名为
新的
的附加列?

创建自定义IEqualityComparer:

public class SampleSentenceComparer : IEqualityComparer<SampleSentence> {

    public bool Equals(SampleSentence x, SampleSentence y) {
        if (x == y) return true;
        if (x == null || y == null) return false;

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

    public int GetHashCode(SampleSentence obj) {
        return obj.Text.GetHashCode();
    }
}
公共类SampleSentenceComparer:IEqualityComparer{
公共布尔等于(样本数x,样本数y){
如果(x==y)返回true;
如果(x==null | | y==null)返回false;
返回x.Text.Equals(y.Text);
}
公共int GetHashCode(SampleSentence obj){
返回obj.Text.GetHashCode();
}
}
用法:

List<SampleSentence> newItems = New.Except(Old, new SampleSentenceComparer()).ToList();
List newItems=New.Except(旧的、新的SampleSentenceComparer()).ToList();

创建自定义IEqualityComparer:

public class SampleSentenceComparer : IEqualityComparer<SampleSentence> {

    public bool Equals(SampleSentence x, SampleSentence y) {
        if (x == y) return true;
        if (x == null || y == null) return false;

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

    public int GetHashCode(SampleSentence obj) {
        return obj.Text.GetHashCode();
    }
}
公共类SampleSentenceComparer:IEqualityComparer{
公共布尔等于(样本数x,样本数y){
如果(x==y)返回true;
如果(x==null | | y==null)返回false;
返回x.Text.Equals(y.Text);
}
公共int GetHashCode(SampleSentence obj){
返回obj.Text.GetHashCode();
}
}
用法:

List<SampleSentence> newItems = New.Except(Old, new SampleSentenceComparer()).ToList();
List newItems=New.Except(旧的、新的SampleSentenceComparer()).ToList();
您可以使用简单的LINQ实现方法/运算符:

IList<SampleSentence> whatINeed = New.GroupJoin(Old,
        newElement => newElement.Text, oldElement => oldElement.Text,
        (newElement, oldElements) => new { newElement, oldElements })
    .Where(match => !match.oldElements.Any())
    .Select(match => match.newElement)
    .ToList();
您可以使用简单的LINQ方法/运算符实现:

IList<SampleSentence> whatINeed = New.GroupJoin(Old,
        newElement => newElement.Text, oldElement => oldElement.Text,
        (newElement, oldElements) => new { newElement, oldElements })
    .Where(match => !match.oldElements.Any())
    .Select(match => match.newElement)
    .ToList();

“列表中的附加列是否命名为新的”附加列?你的意思是说添加行吗?我不确定我是否理解得很好:你想检查哪一行是新的?新.除(旧).ToList()外;您需要重写Equals以测试文本相等性,为了澄清,您想通过比较
Text
属性将
Old
中的对象与
New
中的对象进行比较,从而创建一个包含两个列表的并集的新集合吗?如果
samplementence
New
Old
中都存在,您希望将哪一个作为新列表?可能与我添加的示例重复。希望这有帮助。在我的示例中,旧列表只有一行,新列表有两行。我需要的是一个列表,其中的行是新的,而不是旧的。在这种情况下,一个具有一个samplementence且Text='dog'”的列表中的其他列是否命名为New“其他列”?你的意思是说添加行吗?我不确定我是否理解得很好:你想检查哪一行是新的?新.除(旧).ToList()外;您需要重写Equals以测试文本相等性,为了澄清,您想通过比较
Text
属性将
Old
中的对象与
New
中的对象进行比较,从而创建一个包含两个列表的并集的新集合吗?如果
samplementence
New
Old
中都存在,您希望将哪一个作为新列表?可能与我添加的示例重复。希望这有帮助。在我的示例中,旧列表只有一行,新列表有两行。我需要的是一个列表,其中的行是新的,而不是旧的。在这种情况下,一个列表使用
GetHashCode
,该列表的一个samplementence为Text='dog'
。但无论如何,您都应该覆盖
Equals
GetHashCode
。您应该为该任务使用自定义的相等比较器(基于委托)。任何ID为的类都有基于该ID的默认等式。经验法则:不要用全局解决方案解决局部问题:o)@SirRufo谢谢你的建议,我不知道这个重载。编辑为suggested@nkoniishvt忘了我的评论吧。。。这里太热了;o)
Except
使用
GetHashCode
。但无论如何,您都应该覆盖
Equals
GetHashCode
。您应该为该任务使用自定义的相等比较器(基于委托)。任何ID为的类都有基于该ID的默认等式。经验法则:不要用全局解决方案解决局部问题:o)@SirRufo谢谢你的建议,我不知道这个重载。编辑为suggested@nkoniishvt忘了我的评论吧。。。这里太热了;o)