我有一个集合,我正在尝试获取行的计数,根据下面的实现,我得到的结果如下,但我期望计数为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" }
答案 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();