如何使用LINQ避免冗余List

时间:2012-11-29 14:46:45

标签: c# linq

我有一个Report对象,它有Recipients属性(String数据类型)。 “收件人”属性将在comma separated string中保留所有收件人的电子邮件地址。我需要从逗号分隔的字符串中创建一个“集合”的电子邮件对象。我有以下代码使用字符串列表来获取电子邮件地址。然后我创建了一个电子邮件对象的集合。

是否有更好的方法可以使用LINQ来避免冗余的List和Collection?

  Report report = new Report();
  report.Recipients   = "test@test.com, demo@demo.com";

  List<string> emailAddressList = new List<string>( report.Recipients.Split(',') );
  Collection<Email> emailObjectCollection = new Collection<Email>();

  foreach (string emailAddress in emailAddressList)
  {
           Email email = new Email();
           email.EmailAddress = emailAddress;
           emailObjectCollection.Add(email);
  }

参考

  1. Better code for avoiding one dictionary - Case Sensitivity Issue
  2. Remove duplicates in the list using linq
  3. Using LINQ to find duplicates across multiple properties
  4. C#: Difference between List<T> and Collection<T> (CA1002, Do not expose generic lists)
  5.   

    CA1002 :不要公开通用列表。 System.Collections.Generic.List是一个通用集合,专为性能而非继承而设计,因此不包含任何虚拟成员。 http://msdn.microsoft.com/en-us/library/ms182142(v=vs.80).aspx

3 个答案:

答案 0 :(得分:4)

您只需使用HashSet

var emailObjectCollection = new HashSet<Email>(
     report.Recipients.Split(',').Select(e => new Email() { EmailAddress = e }));

答案 1 :(得分:4)

var  emailObjectCollection =   report.Recipients.Split(',')
                                    .Select(m=>new Email(){EmailAddress = m})
                                    .ToList()

答案 2 :(得分:1)

刚刚出头:

var emailObjectCollection = new Collection<Email>(
    new List<string>(report.Recipients.Split(',')).Distinct()
        .Select<string, Email>(e => 
        {
            var email = new Email();
            email.EmailAddress = e;
        }).ToList());

这应该是使用唯一值填充Collection<T>的LINQ-y方式。但好奇的是,为什么要使用Collection?如果你需要传递这个可枚举的内容,使用IEnumerable会更有意义吗?

另外,你可以使用抑制属性来抑制CA1002消息 - 规则中有不时有效的例外情况(恕我直言)。