2016-04-19 6 views
4

ProblemWie erstelle ich eine Liste <int> Basead auf zwei Eigenschaften aus einer anderen Liste?

Ich brauche eine List<int> basead auf zwei Eigenschaften aus einer anderen Liste zu erstellen.

Beispiel

Ich habe eine Klasse, die zwei Felder hat, die ich brauche.

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

Über dem Code ist es ein Beispiel, also konzentrieren Sie sich nicht dort.

Ich möchte diese Eigenschaften abrufen wie:

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

gewünschte Ausgabe

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

Es gibt einen Weg, dies .Select(x => Something).ToList() mit zu erreichen, ohne einen Code wie:

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

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

Vielen Dank im Voraus, sorry mein armes Englisch.

+2

Ich kenne die genaue Syntax nicht, aber Sie sollten in C# ''SelectMany()' Funktion suchen. Ich denke, es ist genau das, wonach Sie suchen. Sehen Sie hier: http://www.codethinked.com/a-visual-look-at-the-linq-selectmany-operator –

+0

Sie haben Recht, das ist genau das, was ich brauche. Ich danke dir sehr ! –

Antwort

4

Versuchen

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

Wie in:

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; 

Es ist mir nicht ganz klar ist, wenn man x.ValueIdTwoId nur weil x.valueId ist null verwerfen wollen. Wenn dies der Fall ist, verwenden Sie stattdessen

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

.

Wie andere festgestellt haben, benötigen Sie LINQs Operation. Die from in den Codebeispielen oben übersetzt zu SelectMany, wie in den Anmerkungen für die Enumerable.SelectMany Method on MSDN beschrieben.

Verwandte Themen