Ich habe unter Code in 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");
}
Versuchen:
var firstElement = lstComp.First();
Sie können auch FirstOrDefault()
verwenden, falls lstComp
keine Elemente enthält.
http://msdn.Microsoft.com/de-de/library/bb340482(v=vs.100).aspx
Bearbeiten:
Um den Component Value
zu erhalten:
var firstElement = lstComp.First().ComponentValue("Dep");
Dies würde annehmen, dass es ein Element in lstComp
gibt. Ein alternativer und sicherer Weg wäre ...
var firstOrDefault = lstComp.FirstOrDefault();
if (firstOrDefault != null)
{
var firstComponentValue = firstOrDefault.ComponentValue("Dep");
}
Mit [0]
oder .First()
erhalten Sie auf jeden Fall dieselbe Leistung.
Aber Ihre Dictionary
könnte IEnumerable<Component>
anstelle von List<Component>
enthalten, und dann können Sie den []
-Operator nicht verwenden. Hier ist der Unterschied enorm.
Für Ihr Beispiel ist es also nicht wirklich wichtig, aber für diesen Code haben Sie keine Wahl, First () zu verwenden:
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");
}
Du kannst tun
Component depCountry = lstComp
.Select(x => x.ComponentValue("Dep"))
.FirstOrDefault();
Wenn Sie dies für das gesamte Wertwörterbuch wünschen, können Sie es sogar an den Schlüssel binden
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());
Dadurch erhalten Sie ein neues Wörterbuch. Sie können auf die Werte zugreifen
var myTest = newDictionary[key1].depCountry
für den linq-Ausdruck können Sie folgendermaßen verwenden:
List<int> list = new List<int>() {1,2,3 };
var result = (from l in list
select l).FirstOrDefault();
für den Lambda-Ausdruck können Sie so verwenden
Liste Liste = neue Liste () {1, 2, 3}; int x = list.FirstOrDefault ();
Sie können dies auch verwenden:
var firstOrDefault = lstComp.FirstOrDefault();
if(firstOrDefault != null)
{
//doSmth
}
Ich mache das.
List<Object> list = new List<Object>();
if(list.Count>0){
Object obj = list[0];
}
Ich würde es so machen:
//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"));
aber nur, wenn sicher ist, dass die Liste nur Objekte der Component-Klasse oder der untergeordneten Objekte enthält
var firstObjectsOfValues = (from d in dic select d.Value[0].ComponentValue("Dep"));
Es gibt eine Reihe solcher Methoden:.First .FirstOrDefault .Single .SingleOrDefault
.__ Wählen Sie aus, welche am besten zu Ihnen passt.
Versuchen Sie dies, um zuerst die gesamte Liste und dann Ihr gewünschtes Element zu erhalten (sagen Sie in Ihrem Fall das Erste):
var desiredElementCompoundValueList = new List<YourType>();
dic.Values.ToList().ForEach( elem =>
{
desiredElementCompoundValue.Add(elem.ComponentValue("Dep"));
});
var x = desiredElementCompoundValueList.FirstOrDefault();
So erhalten Sie direkt den ersten Elementwert ohne viele foreach-Iterationen und Variablenzuweisungen:
var desiredCompoundValue = dic.Values.ToList().Select( elem => elem.CompoundValue("Dep")).FirstOrDefault();
Sehen Sie den Unterschied zwischen den beiden Ansätzen: Im ersten Ansatz erhalten Sie die Liste über eine ForEach-Funktion und dann Ihr Element. In der Sekunde können Sie Ihren Wert auf direktem Weg erhalten.
Gleiches Ergebnis, andere Berechnung;)