Porównywanie list i zapis różnic

0

Witam, mam mały problem w pewnym sensie działa lecz przy większej ilości coś mi się sypie.

public List<String> windowHendler_Start_Hendler_List = new List<String>();
public List<String> windowHendler_New_Hendler_List = new List<String>();

windowHendler_Start_Hendler_List // - jest lista pobraną przed jakąś akcją 

windowHendler_New_Hendler_List // - jest lista pobraną po jakiejś akcji 

po akcji chciał bym ją porównać i dodać do

public List<String> windowHendler_Diffrent_Hendler_List = new List<String>();

ogólnie kod działa mi tylko na początku. W przypadku jak Start_List ma jeden element a New_List może mieć więcej.


foreach (String elementNew in MV_SeleniumAutomatWork.AutomatDo.Storage.windowHendler_New_Hendler_List)
            {
                foreach(String elementStart in MV_SeleniumAutomatWork.AutomatDo.Storage.windowHendler_Start_Hendler_List)
                {
                   if(elementNew != elementStart)
                    {
                        windowHendler_Diffrent_Hendler_List.Add(elementNew);
                        ProcessInformation_Add("Diffrent : " + elementNew ); //wyswietlenie elementu
                    }
                }
            }

I tutaj elementy się dublują przy ponownym wywołaniu konta podczas sprawdzania. Listy na pewno czyszczę lecz podczas dodawania się coś chrzani.

Chyba już wiem co tylko nie wiem jak to jeszcze rozwiązać. Przy takim porównaniu na większej ilości elementach zdublować. Jak można porównać łatwo 2 kolekcje string i znaleźć różnicę ? Był bym wdzięczny.

4
List<string> ThirdList =  SecondList.Except(FirstList).ToList();

;/// może się komuś przydać :>

0

Widzisz to jest generalnie piękny przykład jak rozwiązywać problemy :)
Najpierw szukamy w google a potem zadajemy pytanie.
+1 oczywiście że sam znalazłeś rozwiązanie. Jednak zapewne więcej czasu zajęło Tobie przygotowanie, edytowanie postu niż szukanie informacji :)

1
komur.l napisał(a):
List<string> ThirdList =  SecondList.Except(FirstList).ToList();

Moim zdaniem to niekompletne rozwiązanie - nie zwraca wszystkich elementów, którymi listy się różnią, tylko elementy drugiej listy nieobecne w pierwszej.
SecondList.Except(FirstList).Union(FirstList.Except(SecondList)).ToList() - to powinno zwrócić sumę różnic z obu list, czyli wszystkie różniące się elementy obu list.

4

do operacji na zbiorach lepiej trzymac dane w odpowiednich strukturach (np HashSet ktory ma wbudowana metode robiaca dokladnie to czego potrzebujesz https://msdn.microsoft.com/en-us/library/bb336848(v=vs.110).aspx)

0

Witam dam fajny przykład od razu chyba z zrozumieniem, a w przyszłości będzie mi do tego łatwiej wrócić ;)

Często zdarza się tak, że musimy coś inkrementować oraz dekrementować. Często jest tak że ludzie robią straszny natłok iformacji a my musimy to obsłużyć bo nasza jest taka rola. Przykład działa na zasadzie 2 list inkrementacji oraz dekrementacji gdzie dane się powtarzają.

1 -1 = 0 więc po co wykonywać akcję.

Takie coś dostaje
1003 [AW] [unconfirmLinks] [115,114,574,112,686,588,578,949,699,957,986,988,987,889,37,668,803,36,38,35,33,47,472,475,840,841,474,473,519,517,81,856,857,858,80,420,78,135,959,958]

1004 [AW] [confirmLinks] [114,574,112,686,588,578,699,957,986,988,987,889,668,803,36,38,35,33,472,475,840,841,474,473,517,126,856,857,858,80,420,78,958]

Funkcja do zwrócenia listy z syringa

private List<string> meakList(string strList)
        {
            List<string> returnList = new List<string>();
            string[] tab = Regex.Split(strList, ",");   

            foreach(string i in tab)
            {
                returnList.Add(i);
            }

            return returnList;

        }

 

// Funkcja do porównania

         public List<string> CompareSTRList(List<string> FirstList, List<string> SecondList)
        {
            //return SecondList.Except(FirstList).Union(FirstList.Except(SecondList)).ToList();
            return SecondList.Except(FirstList).ToList();
        }
 

Kod wykonawczy


List<string> ListDekrement = meakList(strList1);
List<string> ListInkrement = meakList(strList2);

ListDekrement = CompareSTRList(ListInkrement, ListDekrement); // wynik 126
ListInkrement = CompareSTRList(ListDekrement, ListInkrement); // wynik 115,949,37,47,519,81,135,959

Jest jeszcze inna metoda. w Tym przypadku nie warzne w jakiej kolejności podamy listy zwróci //126,115,949,37,47,519,81,135,959
Jak widzimy zwróci nam 2 listy w jednej. Najlepiej zrobić w tym przypadku wywołanie tej listy jako nową różnic i z reszty list usunąć te elementy które w tej nie występują.

Myślę że w tym przypadku 1 opcja daje mniej zachodu. Jednak trzeba pamiętać o kolejności i sprawdzić "Bo na starcie przyjołem odwrotne założenie"

public List<string> CompareSTRList(List<string> FirstList, List<string> SecondList)
        {
            return SecondList.Except(FirstList).Union(FirstList.Except(SecondList)).ToList();
        }
 

Ogólnie zamiast 40 dekrementacji mamy 8
Oraz zamiast 33 inkrementacji mamy 1

Więc z ponad 77 akcji zostaje nam 9 do wykonania. Ogólnie efekt był by ten sam, jednak proces związany z każdą inkrementacją oraz dekrementacją może czasem strasznie obciążyć, zwłaszcza jak korzystamy z jakiegoś storagu kolejkowania i wielu takich akcji w krótkim odstępie czasu.

Tak samo mogli by pomyśleć ort! po 2 stronie co wysyłają i dziwią się że mają problemy z przesłaniem danych jak wysyłają ok po 200 pozycji po jednej i 2 stronie, gdzie akcja ma się wykonać tylko dla 10. A ciąg znaków jest kolosalny.

3

"meakList"? Słaba nazwa, słaby kod.

private IList<string> ToList(string list)
{
    return list == null ? new List<string>() : list.Split(',').ToList();
}
0

Poprawka ;)
ListInkrement = CompareIntList(ListDekrement, ListInkrement);
ListDekrement = CompareIntList(ListInkrement, ListDekrement); // Tutaj się posypie ponieważ list inkrementacji ma już 1 pole ^^ bo ją nadpisałem :>

oraz tutaj wyniki źle wpisąłem ;) odwrotnie mają być
ListDekrement = CompareSTRList(ListInkrement, ListDekrement); // wynik 126
ListInkrement = CompareSTRList(ListDekrement, ListInkrement); // wynik 115,949,37,47,519,81,135,959

Przy tym kodzie
ListDekrement // wynik 115,949,37,47,519,81,135,959
ListInkrement// wynik 126

1 użytkowników online, w tym zalogowanych: 0, gości: 1