如何使用LINQ避免冗余列表



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

有没有更好的方法可以避免使用LINQ的冗余列表和集合?

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. 避免使用一个字典的更好代码-区分大小写问题
  2. 使用linq删除列表中的重复项
  3. 使用LINQ在多个属性中查找重复项
  4. C#:列表之间的差异<T>以及集合<T>(CA1002,不公开通用列表)

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

您可以只使用HashSet

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

就在我的脑海中:

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消息-该规则不时存在有效的异常(IMHO)。

最新更新