2017-02-17 3 views
1

Je vol et les segments d'information et je veux avoir cartésienne des segments avec des informations de numéro de vol:Tenue frères et soeurs référence tout en combinant les éléments

class FlightSegment{ 
    public string FlightNumber {get;set;} 
} 

class Flight{ 
    public FlightSegment FlightSegment {get;set;} 
    public List<string> FlightClass {get;set;} 
} 

class FlightSegmentAndFlight{ 
    public string FlightSegmentName {get;set;} 
    public string FlightNumberName {get;set;} 
} 
static class Utils { 
    //util for make cartesian of segments 
    public static IEnumerable<IEnumerable<T>> CartesianItems<T>(this IEnumerable<IEnumerable<T>> sequences) { 
     IEnumerable<IEnumerable<T>> emptyProduct = 
      new[] { Enumerable.Empty<T>() }; 
     IEnumerable<IEnumerable<T>> result = emptyProduct; 
     foreach (IEnumerable<T> sequence in sequences) { 
      result = from accseq in result from item in sequence select accseq.Concat(new[] { item }); 
     } 
     return result; 
    } 
} 
void Main() 
{ 
    var f1 = new Flight(){ 
     FlightSegment = new FlightSegment{FlightNumber = "FN1"}, 
     FlightClass = new List<string> {"A1","B1"} 
    }; 
    var f2 = new Flight{ 
     FlightSegment = new FlightSegment{FlightNumber = "FN2"}, 
     FlightClass = new List<string> {"A2","B2"} 
    }; 
    var flights = new List<Flight>{f1,f2}; 
    var result = flights.Select(x => x.FlightClass).CartesianItems(); 
    Console.WriteLine(result); 

} 

résultats:

A1 A2

A1 B2

B1 A2

B1 B2

Ce que je voudrais avoir

A1, FN1
A2, FN2

A1, FN1
B2, FN2

B1, FN1
A2, FN2

B1, FN1
B2, FN2

Je ne suis pas autorisé à ajouter des propriétés de classes existantes car elles proviennent de la référence wcf. Comment puis-je conserver les informations de numéro de vol en combinant des segments?

je pouvais deviner que je devrais utiliser quelque chose comme:

var result2 = flights.SelectMany(f => f.FlightClass, (f, flightSegments) => new {f, flightSegments}). 
    Select(x=> new { 
    x.flightSegments.CartesianItems(), 
    x.f 
    }); 

et faire cartésienne dans ce

+3

Probablement juste "var result = flights.Select (x => x.FlightClass.Select (fc => new {FlightClass = fc, FlightNumber = x.FlightSegment.FlightNumber})) CartesianItems();". ? Il suffit donc d'ajouter des informations sur FlightNumber à chaque classe. – Evk

+0

@Evk Cela fonctionne :) S'il vous plaît faites-le répondre –

+0

essayez: var result = string.Join ("\ n", vols.Sélectionnez (x => x.FlightClass) .Sélectionnez (x => chaîne.Format ("(x = {0}; y = {1}) ", x [0], x [1])). ToList()); Console.WriteLine (résultat); – jdweng

Répondre

1

Puisque tout ce que vous voulez est simplement joindre le numéro de vol pour la classe de vol, utilisez la classe anonyme pour que, comme ceci:

public static void Main() 
{ 
    var f1 = new Flight() 
    { 
     FlightSegment = new FlightSegment { FlightNumber = "FN1" }, 
     FlightClass = new List<string> { "A1", "B1" } 
    }; 
    var f2 = new Flight 
    { 
     FlightSegment = new FlightSegment { FlightNumber = "FN2" }, 
     FlightClass = new List<string> { "A2", "B2" } 
    }; 
    var flights = new List<Flight> { f1, f2 }; 
    var result = flights.Select(x => x.FlightClass.Select(fc => new {FlightClass = fc, FlightNumber = x.FlightSegment.FlightNumber })).CartesianItems(); 
    foreach (var item in result) 
     Console.WriteLine(String.Join(" ", item.Select(c => c.FlightClass + " " + c.FlightNumber)));   
}