2014-10-23 4 views
1

나는 축구 팀 목록이 있고 각 팀에 일치하는 목록이 들어 있습니다. 각 경기가 득점 득점의 속성을 가지고 있다면, 풋볼 팀의 명단을 주문하여 가장 최근의 경기에서 득점 한 대부분의 득점으로 경기가 끝나기 전에 순서대로 경기를 진행할 수 있습니까? 일치 항목 수를 알 수 없습니다.목록 속성을 사용하는 Linq 주문 목록

내가 LINQ를 파악하지 못할와 일치의 수는 항상 동일합니다 동적 LINQ를

많은 감사

조사에 많은 행운을 가지고 있지 메신저하고 합리적이지만 이론적으로 최대 밤은 그것이 20보다 적을 것으로 예상하십시오. 목표의 수가 동일한 경우 팀 이름을 알파벳순으로 사용합니다.

+0

는 일치의 최대 개수가된다? 한 팀이 다른 팀보다 더 많은 게임을한다면 어떻게해야합니까? – recursive

+1

당신이 그것을 이해하지 못했다고해도, 당신이 시도한 것을 보여주십시오. – ethorn10

+0

원본 게시물을 편집했습니다 – DAVEWASLIN

답변

1

Linq는 기본적으로 재귀를 수행하지 않습니다. 재귀 적 검색을 위해 사용자 지정 비교자를 정의한 다음 OrderBy으로 전달해야 할 수 있습니다. 실제 구조를 보지 않고 의사 코드는 다음과 같습니다.

N = 1 
while(true) 
{ 
    if L has less than N matches 
     if R has less than matches 
      return L.Name.CompareTo(R.Name) // order by team name 
     else 
      return 1 // R has more matches 

    if R has less than matches // L has more matches 
     return -1 

    compare Nth match of each team 
    if equal 
     N = N + 1; 
    else 
     return compare result 
} 
+0

질문을 이해하는 데 문제가 있습니다. 이 부분에서 재귀가 필요한 부분은 무엇입니까? – Aducci

+0

@Aducci는 "각 팀의 최신 경기 점수를 비교 한 다음 경기 전 경기 후 경기 전 경기 등을 비교합니다." 따라서 재귀 비교가 필요합니다. –

+0

고마워요, 이해했습니다 – Aducci

1

재귀는 필요하지 않습니다. 다음은 반복적 인 접근법입니다.

void Main() { 
    var teams = CreateTeams().ToArray(); 
    int games = teams.Min(t => t.Games.Count); 
    var ordered = teams.OrderBy(team => 0); 

    for (int i = games - 1; i >= 0; i--) { 
     var captured = i; // the value of i will change, so use this capturing variable, 
     ordered = ordered.ThenByDescending(team => team.Games[captured].Points); 
    } 
    ordered = ordered.ThenBy(team => team.Name); 

    foreach (var team in ordered) { 
     Console.WriteLine("{0} {1}", team.Name, string.Join(", ", team.Games.Select(game => game.Points))); 
    } 
} 

IEnumerable<Team> CreateTeams() { 
    yield return (new Team("War Donkeys", 1, 2, 3)); 
    yield return (new Team("Fighting Beavers", 2, 2, 3)); 
    yield return (new Team("Angry Potatoes", 2, 1, 3)); 
    yield return (new Team("Wispy Waterfalls", 3, 2, 1)); 
    yield return (new Team("Frisky Felines", 1, 2, 3)); 
} 

class Team { 
    public string Name { get; set; } 
    public IList<Game> Games { get; set; } 

    public Team(string name, params int[] points) { 
     this.Name = name; 
     this.Games = points.Select(p => new Game { Points = p }).ToArray(); 
    } 
} 

class Game { 
    public int Points { get; set; } 
} 

출력

Fighting Beavers 2, 2, 3 
Frisky Felines 1, 2, 3 
War Donkeys 1, 2, 3 
Angry Potatoes 2, 1, 3 
Wispy Waterfalls 3, 2, 1 
+0

예. 순서는 먼저 질문에 지정된대로 최신 성냥을 기준으로합니다. – recursive

+0

Wispy 폭포는 마지막 경기에서 1 점을 얻었습니다. 이는 어떤 팀보다 작기 때문에 마지막으로 주문해야한다고 생각합니다. – recursive

+0

당신이 옳다고 생각합니다. 나는이 질문에 머리를 감싸는 데 어려움을 겪고있다. – Aducci