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,但我如何获得值?
我建议使用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是要检查它是否重复的
使用GroupBy
在Id
的基础上获得不同的值,然后从组中获得第一个对象,并在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