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();