这个LINQ可以更高效吗?

Dea*_*naD 3 c# linq performance

我有一个相当复杂的linq分组,有些重复让我烦恼,但我无法减少它.有没有办法避免两次获得ID =="XYZ"的项目列表?

var example = = new GdsObservableCollection<GroupedQueryResults>(
                items.Where(a => a.SubCategory3 != "{template}")
                     .GroupBy(item => item.SubCategory1)
                     .Select(g => new GroupedQueryResults
                                  {
                                     SubCategory = g.Key,
                                     SectionHeader = (g.Count(x => x.Id == "XYZ") > 0) ?
                                     "Category :" +  g.Where(x => x.Id == "XYZ")
                                                     .First().NewValue :
                                     "Item - " + itemNumber
Run Code Online (Sandbox Code Playgroud)

...

And*_*tel 5

我不会说更有效,但可以稍微小了一点,因为你可以使用内部谓词AnyFirst:

var example = new GdsObservableCollection<GroupedQueryResults>(
            items.Where(a => a.SubCategory3 != "{template}")
                 .GroupBy(item => item.SubCategory1)
                 .Select(g => new GroupedQueryResults
                              {
                                 SubCategory = g.Key,
                                 SectionHeader = g.Any(x => x.Id == "XYZ") ?
                                 "Category :" +  g.First(x => x.Id == "XYZ").NewValue :
                                 "Item - " + itemNumber
Run Code Online (Sandbox Code Playgroud)

  • 值得一提的是,`First`不会比`Where`然后`First`更有效,但它在更少的代码中做得更好,更可读=>更好的代码.`Any` vs.`Count`更有效率 (3认同)

Iva*_*oev 5

x.Id == "XYZ"使用Where+ Select+ FirstOrDefault链结合C#null-coalescing运算符可以避免重复搜索:

SectionHeader = g
    .Where(x => x.Id == "XYZ")
    .Select(x => "Category :" +  x.NewValue)
    .FirstOrDefault() ?? "Item - " + itemNumber
Run Code Online (Sandbox Code Playgroud)