it-swarm.com.de

Wie erhält man mit Linq das erste Objekt aus der Liste <Objekt>?

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");
}
33
Manoj Singh

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");
}
62
Darren

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");
}
6
Cyril Gandon

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     
2
Bob Vale

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 ();

1

Sie können dies auch verwenden:

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

Ich mache das.

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

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

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

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

Es gibt eine Reihe solcher Methoden:
.First .FirstOrDefault .Single .SingleOrDefault
.__ Wählen Sie aus, welche am besten zu Ihnen passt.

0
Vladimir

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;)

0