web-dev-qa-db-fra.com

Comment extraire le premier objet de List <Object> en utilisant Linq

J'ai ci-dessous le code en c # 4.0.

//Dictionary object with Key as string and Value as List of Component type object
Dictionary<String, List<Component>> dic = new Dictionary<String, List<Component>>();

//Here I am trying to do the loping for List<Component>
foreach (List<Component> lstComp in dic.Values.ToList())
{
    // Below I am trying to get first component from the lstComp object.
    // Can we achieve same thing using LINQ?
    // Which one will give more performance as well as good object handling?
    Component depCountry = lstComp[0].ComponentValue("Dep");
}
33
Manoj Singh

Essayer:

var firstElement = lstComp.First();

Vous pouvez également utiliser FirstOrDefault() juste au cas où lstComp ne contiendrait aucun élément.

http://msdn.Microsoft.com/en-gb/library/bb340482(v=vs.100).aspx

Modifier:

Pour obtenir le Component Value:

var firstElement = lstComp.First().ComponentValue("Dep");

Cela supposerait qu'il existe un élément dans lstComp. Une solution alternative et plus sûre serait ...

var firstOrDefault = lstComp.FirstOrDefault();
if (firstOrDefault != null) 
{
    var firstComponentValue = firstOrDefault.ComponentValue("Dep");
}
62
Darren

[0] ou .First() vous donnera la même performance quoi qu'il arrive.
Mais votre Dictionary pourrait contenir IEnumerable<Component> au lieu de List<Component> et vous ne pourrez alors pas utiliser l'opérateur []. C'est là que la différence est énorme.

Donc, pour votre exemple, cela n'a pas vraiment d'importance, mais pour ce code, vous n'avez pas le choix d'utiliser First ():

var dic = new Dictionary<String, IEnumerable<Component>>();
foreach (var components in dic.Values)
{
    // you can't use [0] because components is an IEnumerable<Component>
    var firstComponent = components.First(); // be aware that it will throw an exception if components is empty.
    var depCountry = firstComponent.ComponentValue("Dep");
}
6
Cyril Gandon

Tu peux faire

Component depCountry = lstComp
                       .Select(x => x.ComponentValue("Dep"))
                       .FirstOrDefault();

Alternativement, si vous le souhaitez pour tout le dictionnaire de valeurs, vous pouvez même le rattacher à la clé.

var newDictionary = dic.Select(x => new 
            {
               Key = x.Key,
               Value = x.Value.Select( y => 
                      {
                          depCountry = y.ComponentValue("Dep")
                      }).FirstOrDefault()
             }
             .Where(x => x.Value != null)
             .ToDictionary(x => x.Key, x => x.Value());

Cela vous donnera un nouveau dictionnaire. Vous pouvez accéder aux valeurs 

var myTest = newDictionary[key1].depCountry     
2
Bob Vale

pour l'expression linq que vous pouvez utiliser comme ceci:

 List<int> list = new List<int>() {1,2,3 };
        var result = (from l in list
                     select l).FirstOrDefault();

pour l'expression lambda que vous pouvez utiliser comme ceci 

Liste liste = nouvelle liste () {1, 2, 3}; int x = list.FirstOrDefault ();

1
Abdallah Eltarawy

Vous pouvez aussi utiliser ceci:

var firstOrDefault = lstComp.FirstOrDefault();
if(firstOrDefault != null) 
{
    //doSmth
}
1
Andrei

Je le fais.

List<Object> list = new List<Object>();

if(list.Count>0){
  Object obj = list[0];
}
0
Marivaldo Vivan

Je le ferais comme ça:

//Dictionary object with Key as string and Value as List of Component type object
Dictionary<String, List<Component>> dic = new Dictionary<String, List<Component>>();

//from each element of the dictionary select first component if any
IEnumerable<Component> components = dic.Where(kvp => kvp.Value.Any()).Select(kvp => (kvp.Value.First() as Component).ComponentValue("Dep"));

mais seulement s'il est certain que cette liste ne contient que des objets de la classe Component ou des enfants

0
Sarrus
var firstObjectsOfValues = (from d in dic select d.Value[0].ComponentValue("Dep"));
0
Victor Mukherjee

Il y a un tas de telles méthodes:
.First .FirstOrDefault .Single .SingleOrDefault
Choisissez celui qui vous convient le mieux.

0
Vladimir

Essayez ceci pour obtenir toute la liste en premier, puis votre élément souhaité (dites le premier dans votre cas):

var desiredElementCompoundValueList = new List<YourType>();
dic.Values.ToList().ForEach( elem => 
{
   desiredElementCompoundValue.Add(elem.ComponentValue("Dep"));
});
var x = desiredElementCompoundValueList.FirstOrDefault();

Pour obtenir directement la valeur du premier élément sans beaucoup d'itération foreach ni d'affectation de variable:

var desiredCompoundValue = dic.Values.ToList().Select( elem => elem.CompoundValue("Dep")).FirstOrDefault();

Voyez la différence entre les deux approches: dans la première, vous obtenez la liste via un ForEach, puis votre élément. Dans la seconde, vous pouvez obtenir votre valeur de manière simple.

Même résultat, calcul différent;)

0
Francesco De Lisi