按两列分组计数

时间:2013-12-22 09:39:47

标签: 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="ball" }
};

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

结果= 3; 但我期待Result = 4;

我想要排除在这两个列中重复的记录,如

new Row() { year=1987, name="doll" },
new Row() { year=1987, name="doll" }

3 个答案:

答案 0 :(得分:5)

使用代码:

CoAs.GroupBy(c => c.name.ToLower().Trim(),c => c.year.ToString())

您说要按名称属性进行分组,并且每个组必须是具有该名称的年份列表(您正在使用此GroupBy重载)。

要按两个属性进行分组,您应该这样做:

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

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

答案 1 :(得分:0)

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

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 gCount = CoAs.DistinctBy(p => new { p.name.ToLower().Trim(), p.year}).Count();

答案 2 :(得分:0)

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

int gc =
    CoAs
        .GroupBy(c => c.name.ToLower().Trim(), c => c.year.ToString())
        .Sum(xs => xs.Count());

或者你可以这样做:

int gc = CoAs.Count();