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#
Répondre
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.
+1. Je l'aurais fait de la même manière (au moins pour un article). –
La réponse de Jon a de meilleures performances, mais celle-ci est plus "intégrée". –
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); });
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);
}
}
En quoi est-ce différent de 'source.OrderBy (sélecteur, comparateur) .FirstOrDefault()'? –
Efficacité. OrderBy est O (n * lg n), c'est O (n) je crois. – configurator
Vous avez raison @configurator. Je viens d'examiner la mise en œuvre de OrderBy, et je suis d'accord. +1 Jon. –
- 1. bienvenus minimum dans InnoSetup
- 2. UIScrollView question d'échelle minimum
- 3. JDK minimum pour Groovy
- 4. Border entourant le texte au minimum en utilisant CSS
- 5. Version Apache minimum pour Phusion Passenger
- 6. Paquet SQL - Paquet DTS: droits minimum
- 7. Temps minimum entre les appels AJAX suivants
- 8. Matériel minimum pour un développement Mac efficace
- 9. Minimum à savoir sur Websphere 6
- 10. Création d'un add-in Excel basé sur C# avec un minimum de douleur
- 11. sélection minimum d'une requête avec le groupe par
- 12. Réglage de la largeur de colonne minimum dans SSRS
- 13. Récupérer le minimum/maximum pour chaque groupe dans ActiveRecord
- 14. Quel est le code minimum d'une vue 2D OpenGL?
- 15. Les binaires NUnit minimum pour un projet OSS
- 16. Regex pour correspondre à un minimum de 1 caractère spécial
- 17. Valider plus de deux mots comme minimum sur asp: TextBox
- 18. Réduire la transmission à un minimum avec javascript
- 19. Existe-t-il un meilleur moyen de trouver l'emplacement d'un élément minimum dans un tableau?
- 20. Diagramme en C/C++
- 21. Comment créer une liste liée OneTwoThree avec un nombre minimum d'opérateurs d'affectation?
- 22. fichier virtuel? en c/C++ ou C#
- 23. traduire C++/CLI en C#
- 24. Traduire C++/CLI en C#
- 25. Conversion numérique en C/C++
- 26. Comment désactiver le bouton de réduction en C#?
- 27. Compact-cadre: Réduire au minimum et de restauration ne fonctionne pas
- 28. Mise en route en C
- 29. Bibliothèque Eye-Tracking en C#, C/C++ ou Objective-C
- 30. Indiquez le nombre minimum de godets lors de la construction d'un boost :: unordered_map
Postez votre code, et vous aurez deux fois plus de chances d'obtenir une réponse. –