我想比较两个对象的列表。这些列表包含相同类型的对象。我在我的程序中创建了一个新的列表,我想将它与数据库中的旧列表进行比较。我用一个存储过程得到它,然后把它放入一个对象中。
The old list : the new list :
*Category 1* Category 5
*Category 2* Category 6
*Category 3* *Category 4*
Category 4这里的目标是删除旧列表中的前三个类别,因为它们在新列表中不存在。为了,删除新列表中的第4类,,因为类别4已经存在于旧列表中。
是否可以使用à方法(如Equals() )或使用两个foreach循环来浏览列表?
谢谢你的回答和建议
发布于 2014-09-19 08:59:52
您可以使用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--]);
}发布于 2014-09-19 09:45:24
这不是最漂亮的实现,但最快的方法是:
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;
}发布于 2014-09-19 08:56:59
我会通过排序两个列表并迭代第一个和第二个列表来解决这个问题。我会将第一个列表的当前项目与第二个列表中的当前项目进行比较。如果找到匹配项,则从第二个列表中删除匹配项,然后移到两个列表中的下一个项,否则第一个列表中的当前项将被删除,第一个列表中的迭代将继续进行。
https://stackoverflow.com/questions/25929981
复制相似问题