c# Linq 计数分组依据

本文关键字:Linq | 更新日期: 2023-09-27 18:31:26

My getTrustActivitiesFromStorage List 看起来像这样

venueId     venueName     activityId
1           Location1     Zumba
2           Location2     Yoga
1           Location1     Yoga
1           Location1     MetaFit
3           Location3     Zumba

这是我用来分组等的代码

List<TrustActivities> filteredVenues = new List<TrustActivities>();
IEnumerable<TrustActivities> groupedVenueCollection = getTrustActivitiesFromStorage
    .GroupBy(customer => customer.venueName)
    .Select(group => group.First())
    .OrderBy(x => x.venueName);
    // Loop
    foreach (TrustActivities activity in groupedVenueCollection)
    {
        filteredVenues.Add(new TrustActivities 
        { 
            filterId = Convert.ToInt32(activity.venueId), 
            filterName = activity.venueName,
            filterCount = 55
        });
    }

这将成功对列表进行分组并输出 3 个匹配项:

    1
  • 位置1 (55)
    2 位置2 (55)
    3 位置3 (55)

我需要帮助的最后一位是计算每个组,因此 filterCount = 55 将替换为要给出的动态计数:

    1
  • 位置1 (3)
    2 位置2 (1)
    3 位置3 (1)

有人可以告诉我如何做到这一点吗?

谢谢

c# Linq 计数分组依据

你只需要group.Count()

var groupedVenueCollection = getTrustActivitiesFromStorage
    .GroupBy(customer => customer.venueName)
    .OrderBy(g => g.Key);
foreach (var group in groupedVenueCollection)
{
    TrustActivities firstActivity = group.First();
    filteredVenues.Add(new TrustActivities 
    { 
        filterId = Convert.ToInt32(firstActivity.venueId), 
        filterName = firstActivity.venueName,  // or group.Key
        filterCount = group.Count()  // <--- !!!
    });
}

您也可以在没有循环的情况下在一个查询中执行此操作:

List<TrustActivities> filteredVenues = getTrustActivitiesFromStorage
 .GroupBy(customer => customer.venueName)
 .OrderBy(g => g.Key)
 .Select(g => new { Activity = g.First(), Count = g.Count() })
 .Select(x => new TrustActivities 
    { 
        filterId = Convert.ToInt32(x.Activity.venueId), 
        filterName = x.Activity.venueName,
        filterCount = x.Count
    })
.ToList();

而不是.Select(g => g.First()),你会做这样的事情:

IEnumerable<TrustActivities> groupedVenueCollection = getTrustActivitiesFromStorage
    .GroupBy(customer => new { customer.venueId, customer.venueName });
foreach (var activity in groupedVenueCollection)
{
    filteredVenues.Add(new TrustActivities 
    { 
        filterId = Convert.ToInt32(activity.Key.venueId), 
        filterName = activity.Key.venueName,
        filterCount = activity.Count()
    });
}

此外,您的变量名称令人困惑。该表似乎是场地,但您称它们为客户和活动