C#获取列表<;对象>;与dictionary不同的id和值(列表中有重复项)

本文关键字:列表 和值 id 对象 lt 获取 gt dictionary | 更新日期: 2023-09-27 17:57:28

让我们假设我有一个类:

public class Demo
{
   public string Id { get; set; }
   public string Value { get; set; } 
}

然后是演示的列表

List<Demo> demo = new List<Demo>();

该列表包含许多项,其中许多项是重复项。

示例

 Item1:
     Id= 1;
     Value = "Something"
 Item2:
     Id= 2;
     Value = "Something else"
 Item3:
     Id= 3;
     Value = "Something else in here"
 Item4:
     Id= 1;
     Value = "Something"

 ItemN:
     Id= 2;
     Value = "Something else"

正如您在上面看到的,有几个相同的项目(相同的id和值)。

现在我需要的是将其转换为Dictionary<string,string>,显然可以消除重复项。

顺便说一句,Id是定义项目重复的字段。

编辑:

我试着按ID对列表进行分组,但我不知道如何获得值并使其成为字典

var grouped= demo.GroupBy(t => t.Id).ToList();

现在我可以做grouped.Key,我有ID,但我如何获得值?

C#获取列表<;对象>;与dictionary不同的id和值(列表中有重复项)

我建议使用Lookup<TKey, TValue>:

var idLookup = demo.ToLookup(d => d.Id);

现在,您可以通过以下方式获取给定ID的所有项目:

IEnumerable<Demo> demoWithId2 = idLookup["2"];

如果不包含此Id,则序列为空(demoWithId2.Any() == false)。

如果您想要不同ID的数量:

int numberOfDistinctIDs = idLookup.Count;

如果您想要每个ID的值数:

int numberOfDemoWithId2  = idLookup["2"].Count();

如果你想要一个List<Demo>,每个ID都有一个任意对象(第一个):

demo = idLookup.Select(g => g.First()).ToList();

只是ID,值99.9%相同,但你永远不会知道ID是要检查它是否重复的

使用GroupById的基础上获得不同的值,然后从组中获得第一个对象,并在ToDictionary中获得其值,如:

Dictionary<string, string> dictionary = demo.GroupBy(d => d.Id)
                    .ToDictionary(grp => grp.Key, grp => grp.First().Value);

这将从第一个分组元素中获得CCD_ 11。

请尝试这个。。。

lst.GroupBy (l => l.Id)
    .Select (g => lst.First (l => l.Id==g.Key))
    .ToDictionary (l => l.Id, l=>l.Value);

您可以让Demo类继承自IEquatable,并让它实现Equals()GetHashCode(),如下所示:

public class Demo : IEquatable<Demo>
{
    public string Id { get; set; }
    public string Value { get; set; }
    public bool Equals(Demo other)
    {
        if (ReferenceEquals(other, null)) 
            return false;
        if (ReferenceEquals(this, other)) 
            return true;
        return other.Id == Id;
    }
    public override int GetHashCode()
    {
        return Id.GetHashCode();
    }
}

这将允许您在List上调用.Distinct(),然后转换为Dictionary,如下所示:

List<Demo> demo = new List<Demo>
{
    new Demo { Id = "1", Value = "Something" },
    new Demo { Id = "2", Value = "Something else" },
    new Demo { Id = "3", Value = "Something else in here" },
    new Demo { Id = "1", Value = "Something" },
};
Dictionary<string, string> demoDictionary = demo.Distinct().ToDictionary(d => d.Id, d => d.Value);
demoDictionary.Keys.ToList().ForEach(k => Console.WriteLine("Key: {0} Value: {1}", k, demoDictionary[k]));

结果:

Key: 1 Value: Something
Key: 2 Value: Something else
Key: 3 Value: Something else in here