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);
}
4 Réponses :
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. P>
vérifier mon message complet:
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;
Cette syntaxe de jointure est invalide. Voir ma réponse pour un exemple correct.
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"
}
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();
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.
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