LINQを利用して、クラスの中のディクショナリの中のクラスに持つプロパティの最大値を取得したい


いつも勉強させていただいています。本日は皆様のお知恵を拝借させていただければと思って  
質問いたします。

[code]

    public class TestResult {
        public string Kamoku;
        public int Tensu;
    }
    
    public class Grade {
        public int Rank;
        public List<TestResult> result;
    }
    
    public class Peron {
        public int Id;
        public string Name;
        public Dictionary<string, Grade> dic;
    }
    
[/code]

上記のようなクラスがある場合に、Tensuの最大値を取得したいのですが、どのように書けば簡潔に取得できますでしょうか。

Person personalData = new Person() などして各プロパティやディクショナリには  
値を設定済みという前提ですが、

[code]

    int MaxTensu = personalData.dic.Values.Max(x => x.result.Max(y => y.Tensu));
    
[/code]

この書き方では「シーケンスに要素が要素が含まれていません」でエラーになりました。  
↓ のような書き方にするべきでしょうか。よろしくお願いいたします。

[code]

    int max = 0;
    foreach (Grade g in personalData.dic.Values) {
        int i = g.result.Max(x => x.Tensu);
        if (max < i) {
            max = i;
        }
    }
    
[/code]




(実行効率は別として)考え方は間違ってないと思いますが、`Max`は少なくとも１つ以上の要素を必要とするため、`dic`や`result`の要素が空の場合があるとそのようなエラーになります。

`SelectMany`で一旦平坦化することで、どこかに１つでも`result`の要素があればOKになります。

[code]

    int max = personalData.dic.Values.SelectMany(g => g.result).Max(r => r.Tensu);
    
[/code]

`dic`が空の場合やすべての`result`が空である場合も考慮するなら`DefaultIfEmpty`でデフォルト値を入れるとよいです。

[code]

    int max = personalData.dic.Values.SelectMany(g => g.result)
        .Select(r => r.Tensu).DefaultIfEmpty(0).Max();
    
[/code]

