2009-11-27 5 views
2

Comment puis-je spécifier un code personnalisé pour la comparaison lorsque je trouve un élément minimal dans mon tableau?Tableaux C#: recherche d'un élément minimal personnalisé

Par exemple, j'ai deux tableaux:

int[] a = new int[] {3, 6, 8}; 
int[] b = new int[] {9, -2, 5}; 

Je veux comprendre, quel serait le rapport minimal des éléments avec des indices respectifs (ie trouver au moins 3/9, 6/(-2) et 8/5) puis retourne l'index. Je suis déjà au courant de Array.Min(), mais je me demande s'il est possible de faire n'importe quelle sorte de personnalisation.

Répondre

3

Peut-être quelque chose comme ceci:

double smallest = double.MaxValue; 
int smallestIndex = 0; 

for (int i = 0; i < (a.Length > b.Length ? b.Length : a.Length); i++) 
{ 
    if ((double)a[i]/b[i] < smallest) 
    { 
     smallest = (double)a[i]/b[i]; 
     smallestIndex = i; 
    } 
} 

smallestIndex contiendra l'indice du rapport le plus petit à la fin.

0

avec LINQ, vous pouvez le faire:

  int customMin = a.Select((v, i) => new { a = v, b = b[i] }) 
       .Select(x => x.a/x.b) 
       .Min(); 

la première sélection se confond les deux listes dans le, la deuxième sélection calcule votre mertic personnalisé, nous appelons min pour obtenir le minimum.

+0

Votre solution ne donne pas l'indice. –

3

LINQ pour obtenir la valeur minimale et l'index, vous pouvez regarder cette réponse:

How to use LINQ to select object with minimum or maximum property value

En utilisant la méthode d'extension Jon Skeet, vous pouvez alors écrire

var result = Enumerable.Range(0,a.Length) 
    .Select(i => new {Value = a[i]/b[i], Index = i}) 
    .MinBy(r => r.Value); 

(vous Il faudra faire attention aux 0 dans b)

+0

C'est LINQ, mais la réponse d'Andy est plus directe, sinon estheticaelly agréable. –

+0

+1 pour fournir une réponse dans LINQ, ET reconnaissant que LINQ n'est pas toujours le plus simple. En outre, bon travail remarquant potentiel div par 0. Je n'ai pas vu cela. –

2

Vous pouvez utiliser linq pour 'zipper' les deux séquences ensemble, les ordonner par leur ratio et sélectionner le premier ind ex:

a.Select((item, index) => {new { A = item, B = b[index], Idx = index }) 
    .OrderBy(i => (double)i.A/i.B) 
    .Select(i => i.Idx) 
    .First(); 
+0

+1 Pour l'élégance. C'est dans O (n Log n) cependant. –

+1

Oui, je recommanderais la réponse d'Andy mais je pensais que c'était plutôt sympa aussi – Lee