web-dev-qa-db-ja.com

Linqを使用してList <Object>から最初のオブジェクトを取得する方法

私は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");
}
38
Manoj Singh

試してください:

var firstElement = lstComp.First();

lstCompにアイテムが含まれていない場合にのみ、FirstOrDefault()を使用することもできます。

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

編集:

Component Valueを取得するには:

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

これは、lstCompに要素があると仮定します。代替のより安全な方法は...

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

できるよ

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

あるいは、値のディクショナリ全体に対してこれを必要とする場合は、キーに結び付けることもできます

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

これにより、新しい辞書が作成されます。値にアクセスできます

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

linq式では、次のように使用できます。

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

ラムダ式では、次のように使用できます

リストlist = new List(){1、2、3}; int x = list.FirstOrDefault();

1

これも使用できます:

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

これを試して、最初にすべてのリストを取得し、次に目的の要素を取得します(あなたの場合は最初の要素を言う):

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

多くのforeach反復と変数の割り当てなしで最初の要素値を直接取得するには:

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

2つのアプローチの違いをご覧ください。最初のアプローチでは、ForEachでリストを取得し、次に要素を取得します。第二に、あなたはまっすぐな方法であなたの価値を得ることができます。

同じ結果、異なる計算;)

1

そうする。

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

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

私はこのようにします:

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

ただし、リストにComponentクラスまたは子のオブジェクトのみが含まれていることが確実な場合のみ

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

そのようなメソッドの束があります:
.First .FirstOrDefault .Single .SingleOrDefault
あなたに最適なものを選択してください。

0
Vladimir