2016-04-19 19 views
4

問題如何在另一個列表的兩個屬性上創建一個列表<int> basead?

我需要從另一個列表中的兩個屬性創建List<int> basead。

我有了兩個領域,我需要一個類。

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

如:

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; 

,如果你要放棄x.ValueIdTwoId只是因爲x.valueIdnull不是很清晰。如果是這種情況,請使用

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轉換爲SelectMany,如Enumerable.SelectMany Method on MSDN的註釋中所述。

相關問題