List使用类中的一个变量将输出转换为数组

时间:2014-01-14 19:17:37

标签: c# asp.net list

我正在使用列表来更好地理解它们。我可以将特定的类变量输出到List选项以压缩以下代码吗?

这是我认为应该可行的 (DB.OperationsTeam。(仅从POPSUser类中选择UserEmail变量))

private string OperationsMembers
{
    get
    {
        List<POPSUser> UniqueList = DB.OperationsTeam.UserEmail.Distinct().ToList();
        return string.Join(";", UniqueList);
    }
}

预期产出:adam@my.domain; carol@my.domain; bill@my.domain

这是当前的工作代码,但我认为我不需要使用foreach创建另一个List和循环。我使用了Distinct(),因为有些用户会在数据库查询中的多个部门。

private string OperationsMembers
{
    get
    {
        List<string> EmailAddressList = new List<string>();

        foreach (POPSUser user in DB.OperationsTeam)
        {
            EmailAddressList.Add(user.UserEmail);
        }

        if (EmailAddressList.Count > 0)
        {
            List<string> UniqueList = EmailAddressList.Distinct().ToList();
            return string.Join(";", UniqueList);
        }
        else { return ""; }
    }
}

DB.OperationsTeam是一个包含UserID,UserName,UserEmail等的POPSUser列表。

**有用评论后更新(不知道在哪里发表有用的答案) * 很好,干净,紧凑,谢谢大家!

private string OperationsMembers
{
    get
    {
        return string.Join(";", DB.OperationsTeam.Select(u => u.UserEmail).Distinct());
    }
}

2 个答案:

答案 0 :(得分:4)

我认为您应该将POPSUser实体投射到电子邮件字符串。使用Select运算符进行投影:

DB.OperationsTeam.Select(u => u.UserEmail).Distinct();

附注:您当前正在使用的解决方案将从数据库(即名称,电子邮件,ID等)加载整个用户数据,并在您通过OperationsTeam集进行枚举时实例化用户实例。但是,当您按上述方式进行投影时,它将在服务器端进行,并将生成仅加载必填字段的SQL:

SELECT DISTINCT
   [Extent1].[UserEmail] AS [UserEmail]
FROM [dbo].[OperationsTeam] AS [Extent1]

答案 1 :(得分:2)

问题是.Distinct()会返回“不同”POPSUser个实例,这些实例可能不是您想要的。如果您需要不同的电子邮件,只需插入Select即可提取电子邮件值:

var UniqueList = DB.OperationsTeam
                   .Select(u => u.UserEmail)
                   .Distinct()
                   .ToList();

return string.Join(";", UniqueList);

另请注意,ToList不需要string.Join,因为IEnumerable<string>会接受{{1}}。