使用linq过滤结果,通过使用特定参数删除重复项来返回条目计数

时间:2012-04-02 14:56:07

标签: c# linq

例如:

列表是用户列表

First entry: User -> Id=111 name=aaa

First entry: User -> Id=123 name=aaa

First entry: User -> Id=124 name=ccc

First entry: User -> Id=125 name=ddd

First entry: User -> Id=126 name=ddd

如果参数为Id,则结果为5,如果名称为3,则为3(因为有3个唯一名称)

当此参数不同时,预期输出是具有提供参数的用户数。

提前致谢

5 个答案:

答案 0 :(得分:3)

如果我正确理解您的问题(您想知道具有不同ID或不同名称的用户数),您可以执行以下操作:

int uniqueByIdCount = list.Select(x => x.Id).Distinct().Count();
int uniqueByNameCount = list.Select(x => x.Name).Distinct().Count();

答案 1 :(得分:0)

这应该做你想要的:

int Unique(string parameterName)
{
    List<Whatever> subList = new List<Whatever>();
    if (parameterName == "Id")
    {
        subList = data.Select(x => x.Id);
    } else {
        subList = data.Select(x => x.Name)
    }

    return subList.Distinct().Count();
}

答案 2 :(得分:0)

快速脏方法如下(假设field保存名称)

var param=Expression.Parameter(typeof(User),"i");
var property=Expression.Property(param,field);
var select=Expression.Convert(property,typeof(Object));
var result=items.GroupBy ((Func<User,object>)Expression.Lambda(select,param).Compile()).Count();

结果现在将包含您的答案

答案 3 :(得分:0)

@ajalexander的变体回答使它成为一条指令。

string parameter = "name";
int uniqueCount = list.Select(x => parameter == "Id" ? x.Id : x.Name).Distinct().Count();

答案 4 :(得分:0)

对于在LINQ中执行此操作的简短通用方法,我建议:

list.GroupBy(user=>user.Id).Count();
list.GroupBy(user=>user.Name).Count();

当然,如果您不需要将参数名称作为字符串传递,那就是。你也可以免费获得一些类型的安全性。