使用linq重置(不删除)列表中重复项的属性
本文关键字:属性 列表 重置 linq 删除 使用 | 更新日期: 2023-09-27 18:13:35
我有一个具有属性的类AttachDoc
: DOCUMENT_ID, DOC_NAME
列表中填充了重复项例:
1 Name1
2 Name2
2 Name2
3 Name3
第二个Name2是重复的(基于id和name),我想重置它的名称,但保留那一行。预期结果为:
1 Name1
2 Name2
2 null
3 Name3
我如何使用LINQ来管理它?谢谢你!
假设数据:
List<AttachDoc> list = new List<AttachDoc>()
{
new AttachDoc(){ Id = 1, Name = "Name1" },
new AttachDoc(){ Id = 2, Name = "Name2" },
new AttachDoc(){ Id = 2, Name = "Name2" },
new AttachDoc(){ Id = 3, Name = "Name3" },
};
您可以使用GroupBy
,它产生所需的结果:
var desiredValue = "Desired value";
var groups = list.GroupBy(x => x.Id + x.Name,
(key, elements) =>
elements.Select((y, index) =>
new AttachDoc()
{
Id = y.Id,
Name = index > 0 ? desiredValue : y.Name
}))
.SelectMany(x => x);
结果:
public class Names
{
public int Id { get; set; }
public string Name { get; set; }
public Names() { }
public static List<Names> SampleData()
{
return new List<Names>()
{
new Names(){ Id = 1, Name = "Name1" },
new Names(){ Id = 2, Name = "Name2" },
new Names(){ Id = 2, Name = "Name2" },
new Names(){ Id = 3, Name = "Name3" },
};
}
}
和Main功能:
var query = (from element in names
group element by new { element.Id, element.Name } into g
select new
{
Id = g.Key.Id,
Name = g.Key.Name,
Count = g.Count()
}).Where(p=>p.Count > 1).ToList();
List<int> idToChange = new List<int>();
for (int i=0; i < names.Count; i++)
{
if (query.Select(p => p.Id).Contains(names[i].Id))
{
if (idToChange.Contains(names[i].Id))
names[i].Name = "null";
else
idToChange.Add(names[i].Id);
}
}
和最终结果列表名称包含:
1.Name1
2.Name2
2.null
3.Name3