比较两个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没有特别的原因,任何可以让这个过程更容易的建议都是非常受欢迎的。

比较两个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;
        }