C# 使用LINQ。如何比较两个简单列表以给出新列表和旧列表中的另一个对象列表?
我有两个IList类型的对象: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
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
是一个包含SampleSentenceId和文本字段的SampleSentence列表李>Old
- Object
是一个样本列表,其中只填充了文本字段。它的行数将与objectNew
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)