2009-05-21 7 views
0

J'ai besoin de rechercher une valeur dans une "table" où une table peut être un tableau ou quoi que ce soit vraiment.
Sur le papier, il ressemble à ceci (réduit et généralisé):Méthode efficace pour trouver la valeur dans "Table" C#

Size  500  750 1000 1250 1500 (speed) 
-------------------------------------------- 
6x5  0.1  0.5  0.55 0.58 0.8 
6x4  0.01 0.1  0.4 0.5 0.9 
8x5  0.5  0.9  1.1 1.5 2.0 
10x5  1.2  1.5  2.0 2.7 3.0 
12x6  2.6  3.0  4.4 5.1 7.0 (pressure) 

je dois extraire en quelque sorte la pression quand j'ai une taille variable et la vitesse.
J'ai maintenant mis chaque rangée dans un tableau séparé, mais je voudrais éviter un tas de sinon, mais je ne sais pas vraiment une meilleure façon. Merci pour l'aide.

Répondre

4

en supposant que votre taille et la vitesse sont des valeurs toujours spécifiques et ne tombent pas entre les valeurs spécifiées dans votre exemple (donc pas de taille 780 ou 598 par exemple), le moyen le plus rapide pour effectuer des recherches en fonction de la vitesse et la taille est d'avoir un Dictionary<SizeAndSpeed, double>SizeAndSpeed est une classe comme ceci:

public class SizeAndSpeed : IEquatable<SizeAndSpeed> 
{ 
    public string Size { get; set; } 
    public int Speed { get; set; } 
    public bool Equals(SizeAndSpeed other) 
    { 
     return Size == other.Size && Speed == other.Speed; 
    } 
} 

Je suppose que Size peut être un string mais bien sûr un objet plus complexe pourrait également être utilisé.

0

Au sommet de ma tête, vous pouvez utiliser un DataTable.

Size  Speed  Pressure 
-------------------------------------------- 
6x5  500  0.1 
6x5  750  0.5 
6x5  1000  0.55 
6x5  1250  0.58 
6x5  1500  0.8 
6x4  500  0.01 
1

si la taille est unique, rendre la clé d'un dictionnaire et vous pouvez l'utiliser pour obtenir les autres éléments ...

0

Créer une struct pour maintenir la taille et la vitesse paire:

public struct SizeSpeedKey 
{ 
public string Size; 
public int Speed; 

public SizeSpeedKey(string size, int speed) 
{ 
    Size = size; 
    Speed = speed; 
} 
} 

Ce serait alors le code de recherche:

using System; 
using System.Collections.Generic; 

namespace LookupTable 
{ 
    internal class Program 
    { 
    private static readonly Dictionary<SizeSpeedKey, double> lookupTable = 
     new Dictionary<SizeSpeedKey, double> 
     { 
     {new SizeSpeedKey("6x5", 500), 0.1}, 
     {new SizeSpeedKey("6x5", 750), 0.5}, 
     {new SizeSpeedKey("6x4", 500), 0.01}, 
     {new SizeSpeedKey("6x4", 750), 0.1}, 
     {new SizeSpeedKey("8x5", 500), 0.5}, 
     {new SizeSpeedKey("8x5", 750), 0.9}, 
     }; 

    private static void Main(string[] args) 
    { 
     // these will of course need to be read from the user 
     var size = "6x4"; 
     var speed = 500; 

     Console.WriteLine("For size = {0} and speed = {1}, the pressure will be {2}", size, speed, lookupTable[new SizeSpeedKey(size, speed)]); 
     Console.ReadLine(); 
    } 
    } 
} 
+0

Cela ne fonctionnerait pas. SizeSpeedKey n'implémente pas IEquatable alors comment le dictionnaire peut-il comparer les valeurs clés? –

+0

Oui et non. Les dictionnaires peuvent utiliser des objets arbitraires en tant que clés (tous fournissent .Equals et .GetHashCode). Sans substituer ces méthodes, l'identité est utilisée pour évaluer l'égalité. Maintenant, avec des structs étant copiés tout le temps, trouver la valeur "égale" pourrait en fait être difficile ^^ Vous devez au moins remplacer .Equals comme dans l'exemple de @ rwwilden. –

+0

Hmm ... vrai, ça. +1 pour rwwilden :) –

Questions connexes