2016-04-19 11 views
4

問題リスト<int>を別のリストの2つのプロパティに基づいて作成する方法は?

私は別のリストから二つの性質上List<int> baseadを作成する必要があります。

私は私が必要な2つのフィールドを持つクラスを持っています。

public class MyClass 
{ 
    //Other fields 
    int? ValueId 
    int? ValueTwoId 
} 

上記のコードは例ですので、ここでは焦点を合わせないでください。

私のようなこれらのプロパティ取得したい:

myClassList.ElementAt(0).ValueId = 1; 
myClassList.ElementAt(0).ValueTwoId = 2; 
myClassList.ElementAt(1).ValueId = 3; 
myClassList.ElementAt(1).ValueTwoId = 4; 

List<int> resultList = myClassList.Where(x => x.ValueId != null && x.ValueTwoId != null).Select(x => ??).ToList()); 

所望の出力を

resultList.ElementAt(0) == 1 
resultList.ElementAt(1) == 2 
resultList.ElementAt(2) == 3 
resultList.ElementAt(3) == 4 

.Select(x => Something).ToList()を使用して、これを達成するための方法は、次のようなコードを使用せずに、あります:

List<int> resultList = new List<int>(); 

foreach(var item in myClassList) 
{ 
    resultList.Add(item.ValueId); 
    resultList.Add(item.ValueTwoId); 
} 

ありがとうございます、ごめんなさい私の貧しい英語。

+2

正確な構文は分かりませんが、C#の 'SelectMany()'関数を調べる必要があります。私はそれがまさにあなたが探しているものだと思います。ここをクリックしてください:http://www.codethinked.com/a-visual-look-at-the-linq-selectmany-operator –

+0

あなたは正しいです、それは私が必要とするものです。どうもありがとうございます ! –

答えて

4

のように

List<int> resultList = myClassList 
    .Where(x => x.ValueId != null && x.ValueTwoId != null) 
    .SelectMany(x => new List<int>{x.ValueId.Value, x.ValueTwoId.Value}) 
    .ToList(); 

を試してみてください:あなたはx.ValueIdTwoIdを破棄したい場合にはx.valueIdnullであるという理由だけで、私には非常に明確ではない

using System; 
using System.Collections.Generic; 
using System.Linq; 

namespace Example 
{ 
    internal class Program 
    { 
     public static void Main(string[] args) 
     { 
      var myClassList = new List<MyClass> {new MyClass(), new MyClass()}; 
      myClassList.ElementAt(0).ValueId = 1; 
      myClassList.ElementAt(0).ValueTwoId = 2; 
      myClassList.ElementAt(1).ValueId = 3; 
      myClassList.ElementAt(1).ValueTwoId = 4; 

      var resultList = myClassList 
       .Where(x => x.ValueId != null && x.ValueTwoId != null) 
       .SelectMany(x => new List<int> { x.ValueId.Value, x.ValueTwoId.Value}) 
       .ToList(); 

      foreach (var i in resultList) 
      { 
       Console.WriteLine(i); 
      } 
      //Prints out: 
      //1 
      //2 
      //3 
      //4 
      Console.ReadLine(); 
     } 

     public class MyClass 
     { 
      public int? ValueId; 
      public int? ValueTwoId; 
     } 
    } 
} 
2
var result = from x in myClassList 
      from sub in new[] { x.ValueId, x.ValueTwoId } 
      where sub.HasValue 
      select sub.Value; 

。その場合は、代わりに

var result = from x in myClassList 
      from sub in new[] { x.ValueId, x.ValueTwoId } 
      where x.ValueId.HasValue && x.ValueTwoId.HasValue 
      select sub.Value; 

を使用してください。

他にも触れたように、LINQのSelectMany操作が必要です。上のコードサンプルのfromは、Enumerable.SelectMany Method on MSDNの注釈に記載されているように、SelectManyに変換されます。

関連する問題