首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >比较两个对象列表( C# )

比较两个对象列表( C# )
EN

Stack Overflow用户
提问于 2014-09-19 08:52:21
回答 3查看 7.5K关注 0票数 1

我想比较两个对象的列表。这些列表包含相同类型的对象。我在我的程序中创建了一个新的列表,我想将它与数据库中的旧列表进行比较。我用一个存储过程得到它,然后把它放入一个对象中。

代码语言:javascript
复制
The old list :                     the new list :

*Category 1*                         Category 5
*Category 2*                         Category 6
*Category 3*                         *Category 4*  
Category 4

这里的目标是删除旧列表中的前三个类别,因为它们在新列表中不存在。为了,删除新列表中的第4类,,因为类别4已经存在于旧列表中。

是否可以使用à方法(如Equals() )或使用两个foreach循环来浏览列表?

谢谢你的回答和建议

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-09-19 08:59:52

您可以使用linq、exceptwhere

代码语言:javascript
复制
var a = new List<string> { "a", "b", "c" };
var b = new List<string> { "c", "d", "e" };
var temp = a.Intersect(b).ToList();
b = b.Except(a).ToList();
a = temp;

输出:

代码语言:javascript
复制
a: "c"
b: "d", "e"

注意:如果没有linq,这样做可能会更有效。

代码语言:javascript
复制
var a = new List<string> { "a", "b", "c" };
var b = new List<string> { "c", "d", "e" };

for(int i = 0; i < a.Count; i++)
    if(b.Contains(a[i]))
        b.Remove(a[i]);
    else
        a.Remove(a[i--]);

如果需要根据特定值进行比较

代码语言:javascript
复制
for(int i = 0; i < a.Count; i++)
{
    var obj = b.Where(item => item.Category == a[i].Category);
    if(obj.Any())
        b.Remove(obj.First());
    else
        a.Remove(a[i--]);
}
票数 4
EN

Stack Overflow用户

发布于 2014-09-19 09:45:24

这不是最漂亮的实现,但最快的方法是:

代码语言:javascript
复制
var tempA = new HashSet<int>(inputA.Select(item => item.Id));
var tempB = new HashSet<int>(inputB.Select(item => item.Id));

var resultA = new List<Category>(inputA.Count);
var resultB = new List<Category>(inputB.Count);

foreach (var value in inputA)
    if (tempB.Contains(value.Id))
        resultA.Add(value);

foreach (var value in inputB)
    if (!tempA.Contains(value.Id))
        resultB.Add(value);

resultA.TrimExcess();
resultB.TrimExcess();

// and if needed:
inputA = resultA;
inputB = resultB;

如果您需要的不仅仅是item.id作为惟一的,那么使用一个新的元组,如:

代码语言:javascript
复制
inputA.Select(item => new Tuple<int, string>(item.Id, item.Title));

另一个选项是覆盖类别类中的.GetHashCode,如:

代码语言:javascript
复制
public override int GetHashCode()
{
    return Id.GetHashCode();
}

public override bool Equals(object obj)
{
    var typedObj = obj as Category;
    if (typedObj == null)
        return false;
    return Title == typedObj.Title && Id == typedObj.Id && Rank == typedObj.Rank;
}
票数 1
EN

Stack Overflow用户

发布于 2014-09-19 08:56:59

我会通过排序两个列表并迭代第一个和第二个列表来解决这个问题。我会将第一个列表的当前项目与第二个列表中的当前项目进行比较。如果找到匹配项,则从第二个列表中删除匹配项,然后移到两个列表中的下一个项,否则第一个列表中的当前项将被删除,第一个列表中的迭代将继续进行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25929981

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档