لماذا يختار هذا الافتراضي Ienumerable بدلاً من السلسلة؟
-
28-09-2019 - |
سؤال
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>
.
لا تنتمي إلى StackOverflow