Преобразование VB Linq в C#

#c# #vb.net #linq #c#-4.0 #linq-to-objects

#c# #vb.net #linq #c #-4.0 #привязка к объектам

Вопрос:

Я нахожусь в процессе самостоятельного изучения C # путем преобразования существующего проекта и застрял в преобразовании следующего кода vb linq:

 Dim outStuff = From tt In (From t In Products.SelectMany(Function(p) If(p.tags IsNot Nothing, p.tags, New ObservableCollection(Of TagModel)))
               Group By tagName = t.name,
                                  v = (Aggregate p In Products Where If(p.tags IsNot Nothing, p.tags.Contains(t), Nothing) Into Sum(p.views)),
                                  nl = (Aggregate p In Products Where If(p.tags IsNot Nothing, p.tags.Contains(t), Nothing) Into Sum(p.num_likes))
               Into g = Group, Count())
               Group By name = tt.tagName Into Count = Sum(tt.Count), viewsTotal = Sum(tt.v), num_likesTotal = Sum(tt.nl)
               Select name, Count, viewsTotal, num_likesTotal
  

где Products As ObservableCollection(Of ProductModel)

До сих пор я пытался преобразовать столько:

 var x =  Products.SelectMany(p => (p.tags != null) ? p.tags : new ObservableCollection<TagModel>());
var tags = from t in x group t by t.name into g select new { tagname=g.First().name};
  

‘Group By’ ставит меня в тупик. Любая помощь была бы отличной…

Комментарии:

1. Если это кому-нибудь поможет, вот проект, к которому принадлежит код, который я пытаюсь преобразовать и добавить на страницу: codeproject.com/KB/silverlight/ListDragDropSL.aspx

Ответ №1:

Ваш запрос немного запутан и его трудно понять, но позвольте мне попытаться описать то, что, как я думаю, вы ищете. У вас есть список продуктов, каждый из которых может иметь один или несколько тегов; и вам нужен список всех тегов с подсчетом того, сколько продуктов имеют этот тег, общее количество просмотров продуктов с этим тегом и общее количество «лайков» продукта с этим тегом. Если это так, то следующее должно сработать:

 // may want to add ToArray() here so that filter is not executed multiple times during subsequent query
var productsWithTags = Products.Where(p => p.tags != null);
var outStuff = from t in (from p in productsWithTags
               from t in p.tags
               select t).Distinct()
               let matchingProducts = productsWithTags.Where(p => p.tags.Contains(t))
               select new { name = t.name,
                            Count = matchingProducts.Count(),
                            viewsTotal = matchingProducts.Sum(p => p.views),  
                            num_likesTotal = matchingProducts.Sum(p => p.num_likes)
                          };
  

Ответ №2:

Ваш код выглядит немного сумасшедшим 🙂 … трудно понять, чего вы на самом деле хотите, но я думаю, что это оно:

 var outStuff = Products.SelectMany(p => p.tags)
    .Where(t => t != null)
    .GroupBy(t => t.name)
    .Select(g => new
    {
        Name = g.Key,
        Count = g.Sum(),
        ViewsTotal = g.Sum(x => x.v),
        LikesTotal = g.Sum(x => x.nl),
    });