2010-01-13 4 views
1

J'ai une collection de Points, stockés dans un PointCollection.Utiliser linq pour récupérer des paires de points de la collection?

J'ai besoin des points de la collection pour tracer des lignes. Donc, par exemple, si une collection de points a quatre points, ce sera trois lignes.

Exemple:

(1) le point (1,1) (2) point (2,2) (3) point (3,3) (4) Point (4,4)

Si j'ai une liste de points, composé des quatre points mentionnés ci-dessus, je vais dessiner trois lignes, en utilisant la logique suivante:

ligne 1 - point (1,1), point (2, 2) Ligne 2 - Point (2,2), point (3,3) Ligne 3 - Point (3,3), point (4,4)

Existe-t-il un moyen, en utilisant Linq, les expressions lambda, les méthodes d'extension, etc., d'extraire ces points par paires, à partir de ma liste initiale de points? De cette façon, je peux itérativement prendre chaque paire de points et dessiner mes lignes?

Merci.

+0

Je ne sais pas si vous voulez le faire comme ça. Je voudrais: 1) Essayez d'obtenir le premier élément, sinon - lancer une exception ou un retour, sinon enregistrer le point dans une variable. 2) Jusqu'à la fin: obtenir un autre point, tracer une ligne, enregistrer le nouveau point dans la même var. Cela le garde doux et simple. Utilisez LINQ uniquement lorsque vous en avez besoin. –

Répondre

2

Je pars dans une seconde, mais voici une solution terrible (en ce qu'il utilise des effets secondaires):

Point previous = default(Point); 

return points.Select(p => { Point tmp = previous; 
          previous = p; 
          return new { p1 = tmp, p2 = previous }; 
          }) 
      .Skip(1); // Ignore first (invalid) result 

Vous pouvez probablement faire mieux avec System.Interactive et Scan, mais sinon, il serait probablement préférable d'écrire une nouvelle méthode d'extension. Quelque chose comme ça (en utilisant Tuple de C# 4):

public static IEnumerable<Tuple<T, T>> ConsecutivePairs<T>(this IEnumerable<T> sequence) 
{ 
    // Omitted nullity checking; would need an extra method to cope with 
    // iterator block deferred execution 
    using (IEnumerator<T> iterator = sequence.GetEnumerator()) 
    { 
     if (!iterator.MoveNext()) 
     { 
      yield break; 
     } 
     T previous = iterator.Current; 
     while (iterator.MoveNext()) 
     { 
      yield return Tuple.Create(previous, iterator.Current); 
      previous = iterator.Current; 
     } 
    } 
} 

(Toutes mes excuses pour toute erreur - écrit pressé!)

+0

Je suis amusé combien se conformer à une demande horrible et donner une horrible solution au lieu de dire - vous feriez mieux de le faire de cette façon. –

+0

Je ne pense pas que ce soit une demande horrible cependant ... –

+0

Il est possible, cependant, qu'il y ait un contexte ou d'autres conditions pas entièrement représentées dans la question qui rend la solution pas horrible. Et vous pouvez généralement compter sur au moins une réponse vous disant tout ce qui n'allait pas avec votre question. – Mikeb

Questions connexes