webForumDet fria alternativet

Leta i collection

.NETur .NET

5 svar · 642 visningar · startad av invecklaren

Medlem sedan jan. 2008280 inlägg
Frågan#1

Hej!

Jag har collection med Customer-objekt i. Från annat håll får jag en List med Customer-ID:en. Nu måste jag jämföra dessa. Om customer-id:et från listan inte finns i collectionen så måste jag behandla dessa CustomerID:en.

Koden nedan borde väl fungera principiellt, men borde det inte gå att lösa enklare och snyggare? LINQ?

   
foreach(int i in CustomerIDList)
    {
      foreach (Customer cust in CustCollection)
           { if cust.CustomerID== i
                   {
                   //Gör saker
                    break;
                   }
               
           }
     }
Medlem sedan jan. 20022 440 inlägg
#2
 foreach(int i in CustomerIDList)
{
    var customer = CustCollection.Where(c => c.CustomerID == i).FirstOrDefault();
    // do stuff with customer....
}

Det kan förenklas mer ändå men jag orkar inte nu!

Medlem sedan feb. 200563 inlägg
#3

invecklaren skrev:

Hej!

Jag har collection med Customer-objekt i. Från annat håll får jag en List med Customer-ID:en. Nu måste jag jämföra dessa. Om customer-id:et från listan inte finns i collectionen så måste jag behandla dessa CustomerID:en.

Koden nedan borde väl fungera principiellt, men borde det inte gå att lösa enklare och snyggare? LINQ?

   
foreach(int i in CustomerIDList)
    {
      foreach (Customer cust in CustCollection)
           { if cust.CustomerID== i
                   {
                   //Gör saker
                    break;
                   }
               
           }
     }

Så här kan du göra med LINQ:

        var customer =
            (from cust in CustCollection
             from i in CustomerIDList
             where cust.CustomerID == i
             select cust).FirstOrDefault();
        
        if (customer != null)
        {
            //Gör saker
        }

/ Tomas

Medlem sedan juni 20008 205 inlägg
#4

invecklaren skrev:

Jag har collection med Customer-objekt i. Från annat håll får jag en List med Customer-ID:en. Nu måste jag jämföra dessa. Om customer-id:et från listan inte finns i collectionen så måste jag behandla dessa CustomerID:en.

Förstår jag frågan fel, eller vill du ha fram alla ID:n ur CustomerIDList som inte motsvarar ett objekt i CustCollection? I sådana fall blir det så här:

var orphanedIds = new HashSet<int>(CustomerIDList);
orphanedIds.ExceptWith(from c in CustCollection select c.CustomerID);

Nu innehåller orphanedIds alla ID:n i CustomerIDList som inte motsvarar en kund i CustCollection.

Medlem sedan feb. 200563 inlägg
#5

Efter att ha läst Spangos kommentar så kan jag konstatera att jag inte läste frågan tillräckligt noggrant, men tycker inte heller att kodexemplet i frågan motsvarar den formulerade frågan (om jag nu har förstått frågan denna gången alltså...) och jag tror att den ursprungliga koden med två nästlade loopar måste modifieras ungefär så här för att åtminstone överensstämma med frågan:

        foreach(int i in CustomerIDList) {
            bool idWasFound = false;
            foreach (Customer cust in CustCollection) {
                if( cust.CustomerID == i) {
                    idWasFound = true;
                    break;
                }
            }
            if (!idWasFound) {
                //Gör saker
            }
        }

Det finns många alternativa sätt att implementera ovanstående på, och här är en variant:

        CustomerIDList.Where(i => !CustCollection.Exists(cust => cust.CustomerID == i)).ToList().ForEach(
            i => {
                //Gör saker
            }
        );

/ Tomas

Medlem sedan feb. 20013 023 inlägg
#6

felpost

131 ms totalt · 3 externa anrop · v20260731065814-full.4bcf49fe
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
128 ms — hämta tråd, inlägg och bilagor (db)