Я пытаюсь сделать лямбду с объектом, но у меня есть условия на разных уровнях объекта.
объект сериализован в xml, чтобы показать вам:
<?xml version = "1.0" encoding = "utf-8"?>
<ArrayOfSegment>
<Segment>
<Legs>
<Leg>
<FlightDesignator>
<CarrierCode >G3</CarrierCode>
<FlightNumber >1040</FlightNumber>
</FlightDesignator>
</Leg>
</Legs>
<PaxSegments >
<PaxSegment>
<LiftStatus>Boarded</LiftStatus>
</PaxSegment>
<PaxSegment>
<LiftStatus>CheckedIn</LiftStatus>
</PaxSegment>
</PaxSegments>
</Segment>
<Segment>
<Legs>
<Leg>
<FlightDesignator>
<CarrierCode >G3</CarrierCode>
<FlightNumber >1016</FlightNumber>
</FlightDesignator>
</Leg>
</Legs>
<PaxSegments >
<PaxSegment>
<LiftStatus>Boarded</LiftStatus>
</PaxSegment>
<PaxSegment>
<LiftStatus>CheckedIn</LiftStatus>
</PaxSegment>
</PaxSegments>
</Segment>
</ArrayOfSegment>
Что мне нужно сделать, так это получить сегменты с "FlightNumber" == 1016 и "LiftStatus" == "Boarded", но они находятся на разных уровнях xml.
Может ли мне помочь какой-нибудь специалист по лямбда?
Я думаю, что-то вроде segments.Where(s => s.Legs.Any(l =>l.FlightDesignator.FlightNumber == 1016) && s.PaxSegments.Any(p => p.LiftStatus == "Boarded")). Но было бы лучше, если бы вы вместо этого включили определения классов, если только вы не используете Linq-To-XML, который также был бы чем-то другим.





Использование xml linq:
using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
namespace ConsoleApplication75
{
class Program
{
const string FILENAME = @"c:\temp\test.xml";
static void Main(string[] args)
{
XDocument doc = XDocument.Load(FILENAME);
var status = doc.Descendants("Segment").Select(x => new
{
flightNumber = (string)x.Descendants("FlightNumber").FirstOrDefault(),
carrierCode = (string)x.Descendants("CarrierCode").FirstOrDefault(),
liftStatus = x.Descendants("LiftStatus").Select(y => (string)y).ToList()
}).ToList();
}
}
}
Прежде чем я попытаюсь ответить на ваш вопрос, я хотел бы, чтобы вы подтвердили, что эти типы довольно хорошо соответствуют тому, что есть в вашей иерархии классов C#:
public class Segment
{
public List<Leg> Legs { get; set; }
public List<PaxSegment> PaxSegments { get; set; }
}
public class Leg
{
public FlightDesignator FlightDesignator { get; set; }
}
public class FlightDesignator
{
public string CarrierCode { get; set; }
public string FlightNumber { get; set; }
}
public class PaxSegment
{
public string LiftStatus { get; set; }
}
Во-вторых, я делаю вывод из вашего XML, что это список сегментов, с которыми вы работаете:
var segments = new List<Segment>
{
new Segment
{
Legs = new List<Leg>
{
new Leg {
FlightDesignator = new FlightDesignator{
CarrierCode = "G3",
FlightNumber = "1040"
}
}
},
PaxSegments = new List<PaxSegment> {
new PaxSegment { LiftStatus = "Boarded" },
new PaxSegment { LiftStatus = "CheckedIn" }
}
},
new Segment {
Legs = new List<Leg>
{
new Leg{
FlightDesignator=new FlightDesignator
{
CarrierCode = "G3",
FlightNumber = "1016"
}
}
},
PaxSegments = new List<PaxSegment> {
new PaxSegment { LiftStatus = "Boarded" },
new PaxSegment { LiftStatus = "CheckedIn" }
}
}
};
Если это так, вы можете получить желаемые Segment с помощью следующего запроса:
var desiredSegments = segments.Where(s
=> s.Legs.Any(l => l.FlightDesignator.FlightNumber == "1016")
&& s.PaxSegments.Any(ps => ps.LiftStatus == "Boarded")
);
Однако ваш вопрос немного неясен, поэтому, если вы ищете PaxSegment соответствующих Segment, вы можете следить за SelectMany, чтобы добраться до них:
var desiredPaxSegments = segments
.Where(s
=> s.Legs.Any(l => l.FlightDesignator.FlightNumber == "1016")
&& s.PaxSegments.Any(ps => ps.LiftStatus == "Boarded"))
.SelectMany(s => s.PaxSegments);
Томас Ашан, извините за непонятный вопрос, но вы его поняли! Большое спасибо!
На этот вопрос, вероятно, будет легче ответить, если вы покажете определения типов C#, а не сериализованные экземпляры.