1
 from a in mainDoc.XPathSelectElements("//AssembliesMetrics/Assembly/@Assembly")
                            let aVal=a.Value
                            where aVal.IsNullOrEmpty( )==false&&aVal.Contains(" ")
                            select aVal.Substring(0, aVal.IndexOf(' '))
                              into aName
                              let interestedModules=new[ ] { "Core", "Credit", "Limits", "Overdraft" }
                              where aName.Contains(".")
                              let module=
                                interestedModules
                                .FirstOrDefault(x => aName
                                  .StartsWith(x, StringComparison.InvariantCultureIgnoreCase))
                              where module!=null
                              group aName by module.DefaultIfEmpty() // ienumerable<char>, why?
                                into groups
                                select new { Module=groups.Key??"Other", Count=groups.Count( ) };
4

2 に答える 2

4

moduleは文字列です。

文字列実装IEnumerable<char>.

Enumerable.DefaultIfEmptyを拡張するメソッドを呼び出していますIEnumerable<T>
このメソッドは、 以外のものを返すことはできませんIEnumerable<T>

EDITnull : の値を null 以外の値に置き換えたい場合moduleは、null 合体演算子を使用できます。

group aName by module ?? "SomeValue"

ただし、句のために、module実際には決してなりません。次に、最終節から も削除する必要があります。nullwhere module!=null
??"Other"select

于 2010-10-08T14:10:31.783 に答える
1

この場合、moduleは文字列であるため:

let module = interestedModules
                 .FirstOrDefault(x => aName
                 .StartsWith(x, StringComparison.InvariantCultureIgnoreCase))

文字列で IEnumerable 拡張のいずれかを呼び出すと、IEnumerable<char>.

于 2010-10-08T14:11:18.063 に答える