2009-03-03 8 views
0

J'ai utilisé un Select() pour effectuer un calcul sur chaque membre d'un tableau de structs et je veux maintenant avoir le membre pour lequel un certain attribut est minimal. Je voulais utiliser quelque chose comme Min() sur la séquence sélectionnée, mais je ne sais pas comment retourner la structure complète, plutôt que seulement l'attribut qui est minmal.Minimum d'un struct-Array en C#

+0

Postez votre code, et vous aurez deux fois plus de chances d'obtenir une réponse. –

Répondre

4

Que diriez-vous commander par votre « valeur » et en prenant la première entrée (la valeur minimale):

Persons.OrderBy(p => p.Age).FirstOrDefault(); 

C'est bien sûr si vous ne souhaitez que un élément (qui est ce que vous dites) .

Autre possibilité:

from p in Persons 
where p.Age == Persons.Select(p1 => p1.Age).Min() 
select p; 

Vous obtiendrez ainsi tous les éléments ayant une valeur minimale.

+0

+1. Je l'aurais fait de la même manière (au moins pour un article). –

+0

La réponse de Jon a de meilleures performances, mais celle-ci est plus "intégrée". –

0

Si je comprends bien, je dirais que: utiliser des délégués ...

Voici un Example from Craig Murphy

public class Person 
{ 
      public int age; 
      public string name; 
      public Person(int age, string name) 
      { 
        this.age = age; 
        this.name = name; 
      } 
} 
// everyone under 25: 
List<person> young = people.FindAll(delegate(Person p) { return p.age < 25; }); 

// sort your list: 
people.Sort(delegate(Person p1, Person p2) 
    { return p1.age.CompareTo(p2.age); }); 
2

On dirait que vous voulez utiliser MinBy de MoreLINQ:

public static TSource MinBy<TSource, TKey>(this IEnumerable<TSource> source, 
    Func<TSource, TKey> selector, IComparer<TKey> comparer) 
{ 
    source.ThrowIfNull("source"); 
    selector.ThrowIfNull("selector"); 
    comparer.ThrowIfNull("comparer"); 
    using (IEnumerator<TSource> sourceIterator = source.GetEnumerator()) 
    { 
     if (!sourceIterator.MoveNext()) 
     { 
      throw new InvalidOperationException("Sequence was empty"); 
     } 
     TSource min = sourceIterator.Current; 
     TKey minKey = selector(min); 
     while (sourceIterator.MoveNext()) 
     { 
      TSource candidate = sourceIterator.Current; 
      TKey candidateProjected = selector(candidate); 
      if (comparer.Compare(candidateProjected, minKey) < 0) 
      { 
       min = candidate; 
       minKey = candidateProjected; 
      } 
     } 
     return min; 
    } 
} 

ThrowIfNull est défini comme une méthode d'extension:

internal static void ThrowIfNull<T>(this T argument, string name) 
    where T : class 
{ 
    if (argument == null) 
    { 
     throw new ArgumentNullException(name); 
    } 
} 
+0

En quoi est-ce différent de 'source.OrderBy (sélecteur, comparateur) .FirstOrDefault()'? –

+0

Efficacité. OrderBy est O (n * lg n), c'est O (n) je crois. – configurator

+0

Vous avez raison @configurator. Je viens d'examiner la mise en œuvre de OrderBy, et je suis d'accord. +1 Jon. –

Questions connexes