6
votes

Comparer deux grandes listes génériques

Je ne trouve pas d'exemple spécifique de cela, je pose donc la question. Toute aide appréciée.

J'ai deux grandes listes génériques, à la fois avec plus de 300 000 articles. P>

Je suis en boucle dans la première liste pour retirer les informations et générer un nouvel élément pour une nouvelle liste à la volée , mais je dois rechercher dans la deuxième liste et retourner une valeur, en fonction de trois critères de correspondance, si vous êtes trouvé à ajouter à la liste, comme vous pouvez l'imaginer, faire ce temps 300k * 300k prend du temps. P> Y a-t-il un moyen de le faire plus efficacement? P>

My Code: P>

var reportList = new List<StocksHeldInCustody>();
foreach (var correctDepotHolding in correctDepotHoldings)
  {
    var reportLine = new StocksHeldInCustody();
    reportLine.ClientNo = correctDepotHolding.ClientNo;
    reportLine.Value = correctDepotHolding.ValueOfStock;
    reportLine.Depot = correctDepotHolding.Depot;
    reportLine.SEDOL = correctDepotHolding.StockCode;
    reportLine.Units = correctDepotHolding.QuantityHeld;
    reportLine.Custodian = "Unknown";
    reportLine.StockName = correctDepotHolding.StockR1.Trim() + " " + correctDepotHolding.StockR2.Trim();

    //Get custodian info

    foreach (var ccHolding in ccHoldList)
    {
      if (correctDepotHolding.ClientNo != ccHolding.ClientNo) continue;
      if (correctDepotHolding.Depot != ccHolding.Depot) continue;
      if (correctDepotHolding.StockCode != ccHolding.StockCode) continue;
      if (correctDepotHolding.QuantityHeld != ccHolding.QuantityHeld) continue;
      reportLine.Custodian = ccHolding.Custodian;
      break;
    }
    reportList.Add(reportLine);
  }


3 commentaires

Créez un hachage de tous les Vares ensemble dans l'objet et ne vérifiez que cela, il doit fonctionner rapidement puis


Quelle est la source des données? S'il s'agit d'une base de données décente, cela pourrait être mieux fait de ce côté.


Mise à jour de ma réponse générique avec des détails sur la manière d'effectuer une jointure extérieure à Linq


4 Réponses :


3
votes

Vous pouvez déplacer les données de la liste de recherches dans un dictionnaire, la touche étant un hasch unique des 3 éléments que vous recherchez. Ensuite, vous aurez des recherches très rapides et économiserez des millions d'itérations.


0 commentaires

3
votes

vérifier mon message complet: LINQ Joindre sur des colonnes Mutiples à l'aide de type anonyme fort>

Utilisation de la join intérieure LINQ qui fonctionnera pour vous. P>

EmployeeDataContext edb= new EmployeeDataContext();
var cust = from c in edb.Customers
           join d in edb.Distributors on
             new { CityID = c.CityId, StateID = c.StateId, CountryID = c.CountryId,
                   Id = c.DistributorId }   
           equals
             new { CityID = d.CityId, StateID = d.StateId, CountryID = d.CountryId,
                   Id = d.DistributorId }   
           select c;


1 commentaires

Cette syntaxe de jointure est invalide. Voir ma réponse pour un exemple correct.



1
votes

Utilisez LINQ pour rejoindre les listes et renvoyez-la comment vous aimez.

EG P>

from a in list1
join b in list2
    on new { a.Prop1, a.Prop2 } equals
       new { b.Prop1, b.Prop2 } 
into outer
from b in outer.DefaultIfEmpty()
select new 
    Prop1 = a.Prop1,
    Prop2 = b != null ? b.Prop2 : "Value for Prop2 if the b join is null"
}


0 commentaires

5
votes

Comme pranay dit, une jointure est probablement ce que vous voulez:

var query = from correct in correctDepotHoldings
            join ccHolding in ccHoldList
              on new { correct.ClientNo, correct.Depot,
                       correct.StockCode, correct.QuantityHeld }
              equals new { ccHolding.ClientNo, ccHolding.Depot,
                           ccHolding.StockCode, ccHolding.QuantityHeld }
            // TODO: Fill in the properties here based on correct and ccHolding
            select new StocksHeldInCustody { ... };
var reportList = query.ToList();


5 commentaires

Bonjour, je reçois des erreurs sur le mot-clé "égale" et "ccholding", devrais-je déclarer cela comme une variable avant de l'utiliser?


@Davidjohnson: Oups, oublié la partie "dans". Consultez mon édition - et si vous êtes nouveau à Linq, j'étais un peu de temps pour l'apprendre pleinement.


Merci, j'essaie mais cela semble être comme si c'était juste décidé au hasard sans motif, je suppose que c'est juste un cas d'apprentissage apprendre apprendre !! Merci encore.


Jon, j'ai modifié ma question, serais-tu en mesure d'aider s'il vous plaît?


@Davidjohnson: Pas en ce moment - mais si vous recherchez "Outer Outer Linq", vous obtiendrez beaucoup de hits.