比较两个ArrayList中的项目并返回差异
本文关键字:项目 返回 ArrayList 两个 比较 | 更新日期: 2023-09-27 18:10:03
我目前正在编写一个简单的应用程序来比较两个列表,并在发现差异时返回差异。
注-[int]用于本解释的假想索引
//---------------Prep----------------------------
ArrayList list1 = new ArrayList();
ArrayList storage = new ArrayList();
ArrayList list2 = new ArrayList();
string path = Application.ExecutablePath;
string root = Path.GetDirectoryName(path);
//---------------END Prep------------------------
//---------------Load content into list1------------------------
StreamReader objReader = new StreamReader(root + "/healthy.txt");
string sLine = "";
while (sLine != null)
{
sLine = objReader.ReadLine();
if (sLine != null)
list1.Add(sLine);
}
objReader.Close();
//---------------END Load content into list1------------------------
//---------------Load content into list2------------------------
string[] files = Directory.GetFiles(root, "*.txt", SearchOption.AllDirectories);
foreach (string file in files)
{
storage.Add(file.ToString());
}
foreach (string sOutput2 in storage)
{
list2.Add(GetMD5HashFromFile(sOutput2));
}
//---------------END Load content into list2------------------------
我什么都试过了,但似乎我无法破解。。我如何"循环"浏览两个列表,并按顺序并排比较每个项目,然后返回列表2中与控制列表(列表一(不匹配的项目?
从逻辑上讲,程序会将"More work"作为错误条目返回,因为"music"answers"More work"都在各自列表的第三行,因此会进行检查,结果不匹配。列表1是控制项,所以列表2的条目被记录为奇数。
现在我已经试过了,但我做不到。。有谁愿意阐明这一点,甚至可能引导我找到正确的答案?
非常感谢
编辑:添加了我的两个arrayLists的代码,我只是缺少比较函数。。。
使用ArrayList没有特别的原因,任何可以让这个过程更容易的建议都是非常受欢迎的。
对于初学者,让我们使用一种更现代的方式来阅读行:
IEnumerable<string> list1 = File.ReadLines("file1");
IEnumerable<string> list2 = Directory.EnumerateFiles("folder",
SearchOption.AllDirectories);
然后是列表2中不在列表1中的文件列表:
IList<string> difference = list2.Except(list1).ToList();
ArrayList diffs = new ArrayList();
for(int i=0;i<N;i++) {
if(!one.Item(i).equals(two.Item(i)) )
diffs.Add(two.Item(i));
}
N=两个列表共同的项目数。diffs=列表二中具有奇数的数组列表
如果只想要列表2中的第一个奇数条目,那么在循环中添加一个break
。这里,假设列表中的对象类型已经定义了适当的equals(Object obj)
方法。
在这些之间,您可以获得所需的结果。
IEnumerable<object> result = one.ToArray().Intersect(two.ToArray()); //Gives you what is the same
one.ToArray().Except(two.ToArray()); //Gives you wants in one not two
two.ToArray().Except(one.ToArray()); //Gives you wants in two and not in one
这里有一个简单的整数循环,它应该适用于任何版本的框架。
如果您有自定义对象,以下是重写Equals:的指导原则
http://msdn.microsoft.com/en-us/library/ms173147(v=vs.80(.aspx
ArrayList left = new ArrayList();
ArrayList right = new ArrayList();
left.Add(1);
left.Add(2);
left.Add(3);
right.Add(1);
right.Add(2);
right.Add(4);
bool areEqual = CompareArrayList(left, right);
private bool CompareArrayList(ArrayList left, ArrayList right)
{
if (left == null && right == null)
{
return true;
}
if (left == null || right == null)
{
return false;
}
if (left.Count != right.Count)
{
return false;
}
for (int i = 0; i < left.Count; i++)
{
if (!left[i].Equals(right[i]))
{
return false;
}
}
return true;
}