Сравнение элементов в двух списках ArrayList и возвращаемые различия - PullRequest
1 голос
/ 29 сентября 2011

В настоящее время я пишу простое приложение для сравнения двух списков и возврата различий, если таковые найдены.

Примечание - [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 записывается как нечетная.

Теперь я попробовал это направо и налево, но я не могу этого сделать. Любой, кто захочет сбросить немногоОсветите это или, возможно, даже проведите меня до правильного ответа?

Большое спасибо

РЕДАКТИРОВАТЬ: Добавлен мой код для обоих массивов, я только пропускаю функцию сравнения ...

Нет особой причины для использования ArrayList, любые предложения, которые облегчили бы этот процесс, приветствуются.

Ответы [ 4 ]

1 голос
/ 29 сентября 2011

Для начала давайте использовать более современный способ чтения строк:

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

А затем список файлов из списка2, которых нет в списке1:

IList<string> difference = list2.Except(list1).ToList();
0 голосов
/ 29 сентября 2011

Между ними вы можете получить желаемые результаты.

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 голосов
/ 29 сентября 2011

Вот простой цикл с целыми числами, который должен работать с любой версией фреймворка.

Если у вас есть пользовательские объекты, вот рекомендации по переопределению 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;

        }
0 голосов
/ 29 сентября 2011
  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).

...