لماذا يختار هذا الافتراضي Ienumerable بدلاً من السلسلة؟

StackOverflow https://stackoverflow.com/questions/3891374

سؤال

 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( ) };
هل كانت مفيدة؟

المحلول

module هي سلسلة.

الأدوات الأدوات IEnumerable<char>.

أنت تتصل بـ Enumerable.DefaultIfEmpty الطريقة التي تمتد IEnumerable<T>.
هذه الطريقة لا يمكن أن تعيد أي شيء آخر غير IEnumerable<T>.

تعديل: إذا كنت تريد استبدال null قيم module مع قيمة غير فنية ، يمكنك استخدام مشغل CoaleCking Null:

group aName by module ?? "SomeValue"

لكن، module لن يكون في الواقع null, ، بسبب where module!=null بند.
يجب عليك أيضًا إزالة ??"Other" من النهائي select بند.

نصائح أخرى

لأنه ، في هذه الحالة ، module هي سلسلة:

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

عندما تتصل بأي من الامتدادات التي لا يمكن أن تكون على سلسلة ، فإنها تتحلل إلى IEnumerable<char>.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top