2017-11-20 5 views
0

아래 구조로 2 개의 목록이 있습니다.2 개의 개체 목록을 결합하고 변경된 값을 목록으로 가져 오는 Linq 쿼리

public class Team 
{ 
    public string Id { get; set; } 
    public Driver Driver { get; set; } 
    public Driver Codriver { get; set; } 
} 

public class Driver 
{ 
    public string DriverId { get; set; } 
} 

var modifiedTeams = new List<Team> 
{ 
    new Team {Id = "T1", Driver = new Driver { DriverId = "C2" }, Codriver = new Driver { DriverId = "D2"} }, 
    new Team {Id = "T2", Driver = new Driver { DriverId = "D1"} } 
}; 

var originalTeams = new List<Team> 
{ 
    new Team {Id = "T1", Driver = new Driver { DriverId = "D1" }, Codriver = new Driver { DriverId = "C1"} }, 
    new Team {Id = "T2", Driver = new Driver { DriverId = "D2"}, Codriver = new Driver { DriverId = "C2"} } 
}; 

옮겨진 팀 ID와 함께 이동 된 모든 팀 ID 목록을 가져오고 싶습니다. 예 : 팀 T1 드라이버가 팀 T2 Codriver로 대체됩니다. 그래서 [{T1, 드라이버}, {T2, Codriver}] 위 movedTeams에 대한

최종 출력으로 목록을 할 수 있습니다 :

[{T1,"Driver"},{T2, "Codriver"},{T1, "Driver"}] 

사람이 좀 도와 주시겠습니까.

+0

특별한 linq 솔루션을 찾으십니까? 지금까지 뭐 해봤 어? –

+0

@ Monzhu 나는 LINQ가 아닌 for 루프를 사용하여 간단한 C# 솔루션을 사용해 보았습니다. 그래서 이것이 LINQ –

+0

을 통해 성취 할 수 있는지 알고 싶었습니다. 전적으로 그것을 이해하고 있는지 확신 할 수 없습니다. 그래서 당신은 기본적으로'modifiedTeams'와'originalTeams'를 비교하고 각각의'Team.Id'에 대해 드라이버, 코 드라이버가 바뀌 었는지 확인합니다. =! 또는 인덱스가 중요합니다 (팀 목록의 위치는 무엇입니까? –

답변

0

원하는대로 만들었습니다. LINQ를 쉽게 만드는 드라이버 클래스를 약간 변경했습니다. 더 적은 줄로 끝낼 수는 있지만 읽는 것이 더 어려울 것이라고 확신합니다. 출력 형식을 {{T1, "Driver"}, {T2, "Codriver"}, {T1, "Driver"}로 유지했지만 다시 고려해야합니다.

public class Team 
    { 
     public string Id { get; set; } 
     public List<Driver> Drivers { get; set; } 
    } 

    public class Driver 
    { 
     public string DriverId { get; set; } 
     public bool IsMainDriver { get; set; } 
    } 

    public List<string[]> GetDriverMovementList(List<Team> originalTeams, List<Team> modifiedTeams) 
    { 
     var output = new List<string[]>(); 
     foreach (var team in modifiedTeams) 
     { 
      foreach (var driver in team.Drivers) 
      { 
       // check this team 
       var driverOrig = originalTeams.Where(x => x.Id == team.Id).SelectMany(x => x.Drivers).Where(x => x.IsMainDriver != driver.IsMainDriver).FirstOrDefault(); 
       if (driverOrig == null) 
       { 
        // check other teams 
        driverOrig = originalTeams.Where(x => x.Id != team.Id).SelectMany(x => x.Drivers).Where(y => y.DriverId == driver.DriverId).FirstOrDefault(); 
       } 
       if (driverOrig != null) 
       { 
        var oldTeam = originalTeams.Where(x => x.Drivers.Contains(driverOrig)).FirstOrDefault(); 
        output.Add(new string[] { team.Id, GetDriverRoleName(driver.IsMainDriver) }); 
        output.Add(new string[] { oldTeam.Id, GetDriverRoleName(driverOrig.IsMainDriver) }); 
       } 
      } 
     } 
     return output; 
    } 

    public static string GetDriverRoleName(bool isMainDriver) 
    { 
     if (isMainDriver) { return "Driver"; } else { return "Codriver"; } 
    } 
+0

SelectMany에 대해 MoreLinq라는 Nuget 패키지가 필요할 수 있습니다. –