C# C集合合并条目

C# C集合合并条目,c#,C#,如果我的联系人列表如下所示: public class Contact { public string Name { get; set; } public string Fax { get; set; } public string Email {get; set; } } 这就是我迄今为止所尝试的: ╔═════╦══════╦═════════════╗ ║Name ║ Fax ║ Email ║ ╠══

如果我的联系人列表如下所示:

    public class Contact
    {
        public string Name { get; set; }
        public string Fax { get; set; }
        public string Email {get; set; }
    }
这就是我迄今为止所尝试的:

╔═════╦══════╦═════════════╗
║Name ║ Fax  ║ Email       ║
╠═════╬══════╬═════════════╣
║  a  ║ 1    ║ a@email.com ║
║  b  ║ 2    ║ b@email.com ║
║  c  ║ 3    ║ c@email.com ║
╚═════╩══════╩═════════════╝

有没有更有效的方法?

看起来你需要做一个GroupBy,然后我假设这些值是空值,所以你只想得到第一个非空值

var result = contactList.Select(contact => contact.Name)
                             .Distinct()
                             .Select(name => contactList.First(contact => contact.Name == name))
                             .ToList();


 foreach (var contact in contactList)
            {
                var c = result.First(r => r.Name == contact.Name);
                c.Name = string.IsNullOrWhiteSpace(contact.Name) ? c.Name : contact.Name;
                c.Fax = string.IsNullOrWhiteSpace(contact.Fax ? c.Fax : contact.Fax;
                c.Email = string.IsNullOrWhiteSpace(contact.Email) ? c.Email : contact.Email;
            }
或者在方法语法中

var results = (from contact in constactList
               group contact by contact.Name into contacts
               select new Contact
               {
                   Name = contacts.Key,
                   Fax = contacts.FirstOrDefault(c => c.Fax != null)?.Fax,
                   Email = contacts.FirstOrDefault(c => c.Email != null)?.Email 
               }).ToList();
或者,如果它们是空白字符串,您也可以这样做

var results = constactList.GroupBy(contact => contact.Name)
    .Select(contacts => new Contact
    {
        Name = contacts.Key,
        Fax = contacts.FirstOrDefault(c => c.Fax != null)?.Fax,
        Email = contacts.FirstOrDefault(c => c.Email != null)?.Email 
    }).ToList();
如果你没有c6,那么下面

Fax = contacts.FirstOrDefault(c => !string.IsNullOrWhiteSpace(c.Fax))?.Fax

你可以用字典。遍历列表以获取缺少的信息并筛选重复项:

Fax = contacts.Where(c => !string.IsNullOrWhiteSpace(c.Fax)).Select(c => c.Fax).FirstOrDefault()

这种方法的复杂性正在增加。此外,它还需要额外的内存。

您应该认为可能存在没有电子邮件或传真的条目

var dict = new Dictionary<string, Contact>();
foreach (var contact in contactList)
{
    Contact existingContact;
    if (dict.TryGetValue(contact.Name, out existingContact))
    {
        if (String.IsNullOrEmpty(existingContact.Fax))
            existingContact.Fax = contact.Fax;
        if (String.IsNullOrEmpty(existingContact.Email))
            existingContact.Email = contact.Email;
    }
    else
    {
        dict.Add(contact.Name, contact);
    }
}
var list = dict.Values.ToList();

你的重复定义是什么?你想要的结果是什么?你是在问如何组合相似的项目吗?什么构成重复,因为根据我的定义,没有重复。在创建列表时添加额外信息可能更有效。谢谢。你的解决方案非常明确和彻底。
var dict = new Dictionary<string, Contact>();
foreach (var contact in contactList)
{
    Contact existingContact;
    if (dict.TryGetValue(contact.Name, out existingContact))
    {
        if (String.IsNullOrEmpty(existingContact.Fax))
            existingContact.Fax = contact.Fax;
        if (String.IsNullOrEmpty(existingContact.Email))
            existingContact.Email = contact.Email;
    }
    else
    {
        dict.Add(contact.Name, contact);
    }
}
var list = dict.Values.ToList();
var contactList = new List<Contact> {
    new Contact { Name="a", Fax = "1", Email=""},
    new Contact { Name="b", Fax = "", Email="b@email.com"},
    new Contact { Name="c", Fax = "3", Email="c@email.com"},
    new Contact { Name="a", Fax = "", Email="a@email.com"},
    new Contact { Name="b", Fax = "2", Email=""},

};

var result = (from c in contactList
                .Where(contact => !string.IsNullOrEmpty(contact.Name))
                .Select(c => c.Name)
                .Distinct()
             let fax = contactList.FirstOrDefault(contact => contact.Name == c &&
                     !string.IsNullOrEmpty(contact.Fax))
             let email = contactList.FirstOrDefault(contact => contact.Name == c &&
                     !string.IsNullOrEmpty(contact.Email))
             select new Contact {
                 Name = c,
                 Fax = fax == null ? "" : fax.Fax,
                 Email = email == null ? "" : email.Email
             })
             .ToList();