C# 按两列分组计数

C# 按两列分组计数,c#,linq,C#,Linq,我有一个集合,我正在尝试获取行的计数,根据下面的实现,我得到的结果如下,但我希望计数为4 List<Row> CoAs = new List<Row>() { new Row() { year=1987, name="doll" }, new Row() { year=1988, name="doll" }, new Row() { year=2000, name="toy" }, new Row() { year=2000, name="

我有一个集合,我正在尝试获取行的计数,根据下面的实现,我得到的结果如下,但我希望计数为4

List<Row> CoAs = new List<Row>()
{
    new Row() { year=1987, name="doll" },
    new Row() { year=1988, name="doll" },
    new Row() { year=2000, name="toy" },
    new Row() { year=2000, name="ball" }
};

int gc = CoAs.GroupBy(c => c.name.ToLower().Trim(),
                           c => c.year.ToString()).Count();
Console.WriteLine(gc);
使用代码:

CoAs.GroupBy(c => c.name.ToLower().Trim(),c => c.year.ToString())
你说的是按名称属性分组,每个组都必须是具有该名称的年份的列表(你正在使用这个重载)

要按这两个属性分组,应执行以下操作:

int gc = 
CoAs
.GroupBy(c => new { Name=c.name.ToLower().Trim(), Year=c.year })
.Count();
其中,在
keySelector
参数中,您将两个属性都指定为组的键。

使用代码:

CoAs.GroupBy(c => c.name.ToLower().Trim(),c => c.year.ToString())
你说的是按名称属性分组,每个组都必须是具有该名称的年份的列表(你正在使用这个重载)

要按这两个属性分组,应执行以下操作:

int gc = 
CoAs
.GroupBy(c => new { Name=c.name.ToLower().Trim(), Year=c.year })
.Count();

其中,在
keySelector
参数中,您将这两个属性指定为组的键。

如果要删除这两个属性上的重复项,则:

int gc = CoAs
          .GroupBy(x => new {x.name.ToLower().Trim(), x.year} )
          .Count();
或者,您可以根据属性编写自己的独特方法:

public static IEnumerable<TSource> DistinctBy<TSource, TKey>
    (this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
{
    HashSet<TKey> seenKeys = new HashSet<TKey>();
    foreach (TSource element in source)
    {
        if (seenKeys.Add(keySelector(element)))
        {
            yield return element;
        }
    }
}

如果要删除这两个属性上的重复项,请执行以下操作:

int gc = CoAs
          .GroupBy(x => new {x.name.ToLower().Trim(), x.year} )
          .Count();
或者,您可以根据属性编写自己的独特方法:

public static IEnumerable<TSource> DistinctBy<TSource, TKey>
    (this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
{
    HashSet<TKey> seenKeys = new HashSet<TKey>();
    foreach (TSource element in source)
    {
        if (seenKeys.Add(keySelector(element)))
        {
            yield return element;
        }
    }
}

您正在计算组,而不是行。如果要在分组后计算行数,请执行以下操作:

int gc =
    CoAs
        .GroupBy(c => c.name.ToLower().Trim(), c => c.year.ToString())
        .Sum(xs => xs.Count());
或者,您也可以这样做:

int gc = CoAs.Count();

您正在计算组,而不是行。如果要在分组后计算行数,请执行以下操作:

int gc =
    CoAs
        .GroupBy(c => c.name.ToLower().Trim(), c => c.year.ToString())
        .Sum(xs => xs.Count());
或者,您也可以这样做:

int gc = CoAs.Count();

首先,这不会编译。第二,它仍然会给出输出3。DigeMail的答案是正确的。首先,这不会编译。第二,它仍然会给出输出3。所有答案都是正确的。