Just nu i M3-nätverket
Gå till innehåll

Hitta del av en sträng i en lista


Aastra

Rekommendera Poster

Jag hittar många exempel på jämförelser men inte liknande de problemet jag har.

Jag har en lista med olika unika namn och värden:

 

minLista

ettNamn: 1
ettAnnatNamn: 0
ettTredjeName: 0
ettFjärdeNamn: 1

 

I enAnnanLista kan jag ha motsvarande namn men värdet kan vara annorlunda. Jag vill alltså jämföra minLista men enAnnanLista och först vill jag ha fram om det finns namn som stämmer överens. OM samma namn finns i båda listorna så vill jag se om även värdet är det samma.

Eftersom att det inte är säkert att namnet finns i båda listorna så vill jag alltså inte göra en jämförelse på hela namnet och värdet samtidigt. minLista kommer dessutom alltid att innehålla fler namn+värden än enAnnanLista

Länk till kommentar
Dela på andra webbplatser

Jo, hade inte tid igår. Du behöver utveckla vad resultatet av jämförelsen ska vara, det var lite luddigt uttryckt. Du anger flera typer av jämförelser, är det flera listor du vill ha som returvärde? Beskriv exakt vad du vill ha för resultat så kan du få ett förslag under förmiddagen.

Länk till kommentar
Dela på andra webbplatser

Jag gör ett nytt försök beskriva vad det är jag vill åstadkomma.

 

I Lista nr1 finns det X antal namn och värden.

ettNamn: 1

ettAnnatNamn: 0

ettTredjeName: 0

ettFjärdeNamn: 1

 

I Lista2 kan motsvarande namn finnas och även värdet kan vara samma men det är inte säkert..

 

Det jag vill göra är:

 

OM ettNamn i Lista2 finns i Lista1

kontrollera om även värdena stämmer med varandra?

OM även värdena stämmer

prova ettAnnatNamn

OM värdena inte stämmer

uppdatera Lista1 med värdet från Lista2

tag bort både namn och värde från Lista2

 

Hoppas att detta gör det hela klarare.

 

 

 

 

 

Länk till kommentar
Dela på andra webbplatser

Börja med det här, så får vi se om jag förstått rätt

        private static string compareName;
       private static string compareValue;

       private void SyncLists(ref List<string> listToSync, ref List<string> listToSyncAgainst)
       {
           List<string> source = listToSync.Select(item => (string)item.Clone()).ToList();
           List<string> dest = listToSyncAgainst.Select(item => (string)item.Clone()).ToList();

           dest.ForEach(delegate(string pair)
           {
               string[] arrPair = pair.Split(":".ToCharArray());
               compareName = arrPair[0];
               compareValue = arrPair[1];
               string removeItem = source.Find(UpdatePredicate);
               if (removeItem != null)
               {
                   source.Remove(removeItem);
                   source.Add(pair);
                   dest.Remove(pair);
               }
           });
           listToSync = source;
           listToSyncAgainst = dest;
       }
       private static bool UpdatePredicate(string s)
       {
           string[] pair = s.Split(":".ToCharArray());
           return (compareName == pair[0] && compareValue != pair[1]);
       }

 

 

Som testfall har jag använt följande:

        private void Form1_Load(object sender, EventArgs e)
       {

           List<string> listA = new List<string>();
           List<string> listB = new List<string>();

           listA.Add("ettNamn: 1");
           listA.Add("ettAnnatNamn: 0");
           listA.Add("ettTredjeNamn: 0");
           listA.Add("ettFjärdeNamn: 1");

           listB.Add("ettNamn: 1");
           listB.Add("ettAnnatNamn: 1");
           listB.Add("ettFjärdeNamn: 1");
           listB.Add("ettFemteNamn: 1");

           SyncLists(ref listA, ref listB);
       }

ettAnnatNamn finns i båda listor, men värdet skiljer sig så det tas bort från listB och motsvarande ändras i listA

 

P.S För att slippa klona listorna så skulle du kunna skicka in de båda listorna via en struct och sedan returnera denna struct.

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...