比较两个ArrayLists中的项目和返回差异

时间:2011-09-28 20:39:03

标签: c# arraylist compare

我正在编写一个简单的应用程序来比较两个列表,如果找到则返回差异。

注 - 用于此解释的[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------------------------

我尝试了一切,但似乎我无法解决这个问题。我如何“循环”通过两个列表并将每个项目并排比较然后返回列表中的一个与控件不匹配的列表列表(列表一)?

逻辑上,程序会将“更多工作”作为错误条目返回,因为“音乐”和“更多工作”都位于各自列表的第三行,它们会被检查并且不匹配。列表1是控制,因此列表2的条目被记录为奇数。

现在我已经尝试过左右,但是我不能让它成为现实。那些愿意对此有所了解甚至可能引导我找到正确答案的人?

非常感谢

编辑:为两个arrayLists添加了我的代码,我只缺少比较函数...

使用ArrayList没有特别的原因,非常欢迎任何使这个过程更容易的建议。

4 个答案:

答案 0 :(得分:1)

首先,让我们用更现代的方式阅读这些内容:

IEnumerable<string> list1 = File.ReadLines("file1");
IEnumerable<string> list2 = Directory.EnumerateFiles("folder", 
       SearchOption.AllDirectories);

然后list2中不在list1中的文件列表:

IList<string> difference = list2.Except(list1).ToList();

答案 1 :(得分:0)

  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 =两个列表中的coomon项目数。 diffs =具有列表二的奇数的arraylist

如果只想要列表2中的第一个奇数条目,则在循环中添加break。这里,假定列表中的对象类型已经定义了适当的equals(Object obj)方法。

答案 2 :(得分:0)

在这些之间你可以得到你想要的结果。

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

答案 3 :(得分:0)

这是一个带有整数的简单循环,可以与框架的任何版本一起使用。

如果您有自定义对象,则以下是覆盖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;

        }