7
votes

Quelle collection C # à utiliser au lieu de la liste >?

Je veux stocker des données telles que les données

StringDoubleCollection data = new StringDoubleCollection();
data.add("apple",15);
data.add("",10);

double max = data.values.Max(); 
double min = data.values.Min();


4 commentaires

Stackoverflow a tué mon message en n'échantillant pas de "<". Donc, mes dernières remarques étaient de savoir comment obtenir la valeur maximale de la liste > et nomeucollection est agréable mais c'est une chaîne J'ai besoin d'une


Correction du formatage de vous.


Ce que vous voulez, c'est fondamentalement un dictionnaire qui permet des clés en double. Selon cette question: Stackoverflow.com/questions/146204/ ... Il n'y a rien dans le cadre qui le supporte. Vous aurez probablement besoin de faire votre propre version générique de NameValuecollection.


merci rayon de réparation


7 Réponses :


1
votes

Avez-vous regardé Recherche ?

Le seul problème est que c'est immuable, vous devez donc pouvoir créer votre collection en une seule fois.

Comme Anthony Pegram note, c'est un peu une douleur à en créer un. Cela dépend de l'endroit où vient vos données. Regardez le méthode Tolookup . < / p>


2 commentaires

Le problème avec c'est que ce n'est pas directement instanciable. Vous commencez à partir de quelque chose d'autre et pouvez ensuite projeter dans cela. Il aurait besoin d'une structure intermédiaire d'abord.


Ouais c'est vrai. Mais il pourrait encore être possible en fonction de l'endroit où ses données proviennent (aucune information n'a été fournie). Cela vaut la peine de connaître dans tous les cas.



6
votes

Vous pouvez créer une classe comme les suivantes: xxx pré>

puis obtenir des valeurs maximales et minimales à l'aide de LINQ avec un sélecteur: P>

// Inside X class...
public static implicit operator X(double d)
{
    return new X(d);
}

// Somewhere else...
data.Add(50.0);


2 commentaires

Je suis désolé, j'ai sauté la partie Duplicate lors de la lecture. Édité quand même :)


Ce serait une bonne idée de simplement supprimer le peu du dictionnaire plutôt que de laisser votre modification l'expliquer. Une classe d'encapsulation est une suggestion digne, alors j'ai voté la réponse.



1
votes

Si cela vaut la peine de convivialiser (c'est-à-dire que vous utilisez des collections maladroites de la liste > partout, cela pourrait valoir la peine d'implémenter stringdoublecollection . Il ne serait pas si difficile d'envelopper la collection sous-jacente avec la syntaxe plus conviviale que vous avez décrite dans votre exemple.

et, comme d'autres commentaires / réponses suggèrent, le cadre ne semble pas fournir un plus simple Solution qui correspond à toutes vos exigences ...

comme pour "valeur max", je suppose que vous voulez dire la paire de la valeur de clé avec la plus grande valeur. Il peut être récupéré comme si: < Pré> xxx


0 commentaires

1
votes

Définissez simplement votre propre classe de modèle pour maintenir les données au lieu de clefvaluepair et tout devient plus propre:

using System;
using System.Collections.Generic;

public class Fruit
{
    public string Name {get; set;}
    public double Price {get; set;}
}

public class Program
{
    public static void Main()
    {
        List<Fruit> _myFruit = new List<Fruit>();

        _myFruit.Add(new Fruit{Name="apple", Price=15   });
        _myFruit.Add(new Fruit{Name="pear", Price=12.5  });
        _myFruit.Add(new Fruit{Name="",  Price=10       });
        _myFruit.Add(new Fruit{Name="",  Price=0.45     });

        // etc...
    }
}


0 commentaires

0
votes

Qu'en est-il de la mise en œuvre de la stringdoublecollection pour fonctionner comme si vous voulez ...

public class StringDoubleCollection
{
    private List<KeyValuePair<string, double>> myValues;
    public List<double> values
    {
        get { return myValues.Select(keyValuePair => keyValuePair.Value).ToList(); }
    }

    public void add(string key, double value)
    {
        myValues.Add(new KeyValuePair<string,double>(key,value));
    }
}


0 commentaires

2
votes

Pour déterminer quelle structure de données que vous voulez vraiment, permet de regarder vos habitudes d'utilisation.

  • insérer des objets de commande.
  • Vous n'accédez pas à vos articles par clé.
  • vous voulez min et max.

    Un tas offre min ou max, mais ne conserve pas la commande. Un dictionnaire basé sur un hachage ne préserve pas la commande. Une liste est en fait un bon choix pour votre structure de données. Il est disponible et offre un excellent support.

    Vous pouvez pénétrer votre code en définissant des classes pour la structure de données et les données de votre barre. Et vous pouvez ajouter des fonctionnalités min / max à la collection. Remarque: je n'ai pas utilisé les fonctions Linq min / max, car elles renvoient la valeur minimale , pas le minimum élément . xxx


0 commentaires

-1
votes

1 commentaires

C'est une réponse très tardive après une réponse différente a été acceptée. Il ne répond également pas à la question car la question originale a demandé quelle collecte à utiliser pour une clé à chaîne et une double valeur. Vous avez répondu à la chaîne, à la chaîne. Veuillez répondre à de vieilles questions s'ils ajoutent une nouvelle valeur et, dans ce cas, veuillez vous assurer que votre réponse répond au problème réel.