繁体   English   中英

比较两个对象列表C#

[英]Compare two list of objects C#

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

The old list :                     the new list :

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

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

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

谢谢您的回答和建议

您可以使用LINQ, exceptwhere

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;

输出:

a: "c"
b: "d", "e"

注意:不使用linq进行此操作可能会更有效

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--]);

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

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--]);
}

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

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,请使用新的元组,例如:

inputA.Select(item => new Tuple<int, string>(item.Id, item.Title));

另一种选择是在类别类中重写.GetHashCode,例如:

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;
}

我可以通过对两个列表进行排序并遍历第一个和第二个列表来解决此问题。 我将比较第一个列表的当前项目和第二个列表的当前项目。 如果找到匹配项,则将匹配项从第二个列表中删除,然后移至两个列表中的下一个项目,否则将第一个列表中的当前项目从中删除,并且迭代将在第一个列表中继续进行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM