2011-09-28 82 views
1

我目前正在编写一个简单的应用程序来比较两个列表并返回差异,如果有任何发现。两个ArrayLists中的项目比较和返回差异

注 - [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中与控制列表(列表1)不匹配的项目?

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

现在我已经尝试了它的权利和离开,但我不能让它发生..任何人谁会愿意在这一点上,或者甚至指导我通过正确的答案吗?

非常感谢

编辑:添加我的代码两者的ArrayList,我只是缺少比较功能...

使用ArrayList的,有什么建议没有特别的原因,这将使这个过程变得更容易是非常欢迎。

+2

为什么使用ArrayList?你还在使用Fx 1.x吗?你可以使用LINQ吗?例如,请添加更多像真实代码一样的东西。 Docs是一个数组吗?请注意,您有一个_edit_按钮。 –

+0

你有什么特别的理由使用ArrayList? – asawyer

+1

列表是否已排序?给定列表“{1,2,4}”和“{1,2,3,4}”,结果应该是“3”吗?如果列表没有排序,是否认为'{1,2,3}'与'{3,2,1}'相同? –

回答

1

首先,让我们用更现代的方式来读取行:

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

然后列表2中不在列表1中的文件列表:

IList<string> difference = list2.Except(list1).ToList(); 
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 =项目编号的数量到两个列表。 diffs =列表2中奇数列表的数组列表

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

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 
0

下面是一个简单的循环,它应该与任何版本的框架一起工作。

如果有自定义对象,这里是压倒一切的方针等于:

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; 

     }