我想比较两个对象列表。这些列表包含相同类型的对象。我在我的程序中创建了一个新列表,我想在数据库中的旧列表中进行比较。我用存储过程得到它,然后我将它放入一个对象。
The old list : the new list :
*Category 1* Category 5
*Category 2* Category 6
*Category 3* *Category 4*
Category 4
此处的目的是删除旧列表中的前三个类别,因为它们在新列表中不存在。并删除新列表中的类别4 ,因为类别4已存在于旧列表中。
可以使用Equals()
等à方法或使用两个foreach
循环来浏览列表吗?
感谢您的回答和建议
答案 0 :(得分:3)
您可以使用linq,except
和where
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--]);
}
答案 1 :(得分:1)
这不是最漂亮的实现,但最快的方法是:
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;
}
答案 2 :(得分:0)
我会通过对两个列表进行排序并迭代第一个和第二个列表来解决这个问题。我会将第一个列表的当前项目与第二个列表中的当前项目进行比较。如果找到匹配,我从第二个列表中删除匹配,然后移动到两个列表中的下一个项目,否则将从中删除第一个列表的当前项目,并在第一个列表中继续迭代。