使用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来管理它?谢谢你!

使用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