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");
}
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");
}
[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");
}
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
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 ();
Vous pouvez aussi utiliser ceci:
var firstOrDefault = lstComp.FirstOrDefault();
if(firstOrDefault != null)
{
//doSmth
}
Je le fais.
List<Object> list = new List<Object>();
if(list.Count>0){
Object obj = list[0];
}
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
var firstObjectsOfValues = (from d in dic select d.Value[0].ComponentValue("Dep"));
Il y a un tas de telles méthodes:.First .FirstOrDefault .Single .SingleOrDefault
Choisissez celui qui vous convient le mieux.
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;)