web-dev-qa-db-fra.com

LINQ sélectionne un champ de la liste des objets DTO dans un tableau

J'ai une classe DTO qui définit la ligne de commande comme ceci:

public class Line
{
    public string Sku { get; set; }
    public int Qty    { get; set; }
}

Une liste de type Line est remplie comme suit:

List<Line> myLines = new List<Line>();
myLines.Add(new Line() { Sku = "ABCD1", Qty = 1 });
myLines.Add(new Line() { Sku = "ABCD2", Qty = 1 });
myLines.Add(new Line() { Sku = "ABCD3", Qty = 1 });

Ce que je veux, c'est utiliser LINQ pour obtenir un tableau de SKU dans la liste myLines. Comment puis-je m'y prendre?

Je le fais actuellement manuellement comme ça ...

// Get SKU List
List<string> mySKUs = new List<string>();
foreach (Line myLine in myLines)
    mySKUs.Add(myLine.Sku);
string[] mySKUsArray = mySKUs.ToArray();

Merci d'avance. J'essayais de chercher une solution sur Google, mais je ne savais pas comment formuler la question ...

P.S. l'utilisation de la méthode LINQ permet-elle de réaliser ce que je suis en train de faire avec foreach?

30
Latheesan

Vous pouvez utiliser:

var mySKUs = myLines.Select(l => l.Sku).ToList();

La méthode Select, dans ce cas, effectue un mappage de IEnumerable<Line> À IEnumerable<string> (La SKU), puis ToList() le convertit en un fichier List<string>.

Notez que cela nécessite que using System.Linq; Soit en haut de votre fichier .cs.

62
Reed Copsey

C’est très simple dans LinQ ... Vous pouvez utiliser l’instruction select pour obtenir un Enumerable de propriétés des objets.

var mySkus = myLines.Select(x => x.Sku);

Ou si vous le voulez comme un tableau, faites-le ...

var mySkus = myLines.Select(x => x.Sku).ToArray();
3
Kevin

Si les augmentations de performances extrêmement mineures et presque incommensurables vous intéressent, ajoutez un constructeur à votre classe Line, en vous donnant les caractéristiques suivantes:

public class Line
{
    public Line(string sku, int qty)
    {
        this.Sku = sku;
        this.Qty = qty;
    }

    public string Sku { get; set; }
    public int Qty    { get; set; }
}

Créez ensuite une classe de collection spécialisée basée sur List<Line> avec une nouvelle méthode, Add:

public class LineList : List<Line>
{
    public void Add(string sku, int qty)
    {
        this.Add(new Line(sku, qty));
    }
}

Ensuite, le code qui remplit votre liste devient un peu moins détaillé en utilisant un initialiseur de collection:

LineList myLines = new LineList
{
    { "ABCD1", 1 },
    { "ABCD2", 1 },
    { "ABCD3", 1 }
};

Et, bien sûr, comme l’indique l’autre réponse, il est trivial d’extraire les SKU dans un tableau de chaînes avec LINQ:

string[] mySKUsArray = myLines.Select(myLine => myLine.Sku).ToArray();
1
Jesse C. Slicer

Vous pouvez sélectionner tous les éléments de référence de votre liste myLines, puis convertir le résultat en tableau.

string[] mySKUsArray = myLines.Select(x=>x.Sku).ToArray();
1
Christos

Je pense que tu cherches

  string[] skus = myLines.Select(x => x.Sku).ToArray();

Toutefois, si vous envisagez de parcourir le sku dans le code suivant, je vous recommande de ne pas utiliser le bit ToArray() car il force l'exécution des requêtes prématurément et aggrave les performances des applications. Au lieu de cela, vous pouvez simplement faire;

  var skus = myLines.Select(x => x.Sku); // produce IEnumerable<string>

  foreach (string sku in skus) // forces execution of the query
1
evanmcdonnal