Vous essayez de faire deux choses différentes ici. Premièrement, vous essayez de trouver un document, et deuxièmement, vous essayez de changer les choses en fonction de cela. La première étape du processus consiste simplement à clarifier le code que vous avez déjà, par ex.
(Notez que cela prend en compte les commentaires précédents que les index calculés dans le code original ne sont pas nécessaires.) Le même type de scission en deux méthodes pourrait être fait que les index calculés soient ou non requis. améliorer le code original.)
public void FindAndDisplayEventDocWithoutEAN(HandOverDoc handOverDoc)
{
var eventDoc = FindEventDocWithoutEAN(handOverDoc);
if (eventDoc != null)
{
Display(eventDoc);
}
}
public EventDoc FindEventDocWithoutEAN(HandOverDoc handOverDoc)
{
foreach(ItemDoc itemDoc in handOverDoc.Assignment.Items)
foreach(ItemDetailDoc detail in itemDoc.Details)
foreach(EventDoc eventDoc in detail.Events)
if(!eventDoc.HasEAN)
return eventDoc;
return null;
}
public void Display(EventDoc eventDoc)
{
HideShowPanels(pMatch);
txt_EAN.Text = String.Empty;
lbl_Match_ArtName.Text = itemDoc.Name;
lbl_ArtNr.Text = itemDoc.Number;
lbl_unitDesc.Text = eventDoc.Description;
m_tempItemNr = itemNr;
m_tempEventNr = eventDocNr;
txt_EAN.Focus();
}
Une fois que vous avez fait cela, vous devriez être en mesure de voir qu'une méthode est une requête sur le document principal, et l'autre est une méthode pour afficher les résultats de la requête. C'est ce qu'on appelle le principe de la responsabilité unique, où chaque méthode fait une chose, et est nommé d'après ce qu'elle fait.
La transformation des boucles foreach imbriquées en une requête linq est maintenant presque triviale. Comparez la méthode ci-dessous avec la méthode ci-dessus, et vous pouvez voir à quel point il est mécanique de traduire des boucles foreach imbriquées dans une requête linq.
public EventDoc FindEventDocWithoutEAN(HandOverDoc handOverDoc)
{
return (from itemDoc in handOverDoc.Assignment.Items
from detail in itemDoc.Details
from eventDoc in detail.Events
where !eventDoc.HasEAN
select eventDoc).FirstOrDefault();
}
Pas la même chose. Notez comment il a besoin de l'index dans les boucles pour d'autres opérations. – TomTom
Vous n'auriez pas accès au nom et à la description dans itemDoc car seul eventDoc est sélectionné. – Cornelius
Ne permet pas d'accéder au nom et à la description de ItemDoc, par conséquent, il ne fonctionnera pas avec le code à l'intérieur de la boucle. – AxelEckenberger