C# 按两列分组计数
我有一个集合,我正在尝试获取行的计数,根据下面的实现,我得到的结果如下,但我希望计数为4C# 按两列分组计数,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="
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。所有答案都是正确的。