LINQ 将项目列表转换为具有冗余值的行的查找

问题描述

我相信标题没有太大帮助,我会在这里尝试更好地解释......希望你能帮助我。

我有这门课

public class ItemValue
{
    public string SetId {get; set;}
    public string ItemId {get; set;}
    public string Value {get; set;}
}

我有一个像这个类的对象集合

IEnumerable<ItemValue> = new List<ItemValue>()
{
    new ItemValue
    {
        SetId = "S1",ItemId = "I1",Value = "S1I1V",},new ItemValue
    {
        SetId = "S1",ItemId = "I2",Value = "S1I2V",ItemId = "I3",Value = "S1I3V",new ItemValue
    {
        SetId = "S2",Value = "S2I1V",Value = "S2I2V1",Value = "S2I2V2",ItemId = "V3",Value = "S2I3V",}
};

注意有 2 个实例的 SetId="S2"ItemId="I2" 具有不同的值

我需要的是使用 LINQ 将此集合映射到类似的内容

var expectedResult = new Lookup<string,IDictionary<string,string>>()
{
    ["S1"] = new Dictionary<string,string>() 
    {
        { ["I1"] = "S1I1V" },{ ["I2"] = "S1I2V" },{ ["I3"] = "S1I3V" },["S2"] = new Dictionary<string,string>() 
    {
        { ["I1"] = "S2I1V" },{ ["I2"] = "S2I2V1" },{ ["I3"] = "S2I3V" },{ ["I2"] = "S2I2V2" },}
};

我自己并不擅长 LINQ,在经历了一些不成功的 LINQ 试验和使用一堆 foreach 和 ifs 的丑陋解决方案之后,我现在联系您,请您对此提出一些想法。

如果您需要任何其他信息,请告诉我

非常感谢您!...

解决方法

你可以用 GroupBy 和 ToDictionary/ToLookup 做类似的事情

        var dict = items.GroupBy(i => i.SetId)
            .ToDictionary(
                group => group.Key,group => group.ToLookup(i => i.ItemId,i => i.Value));
         dict["S2"]["I2"].ToList() // usage example

另一种选择是

var dict2 = items.ToLookup(i => (i.SetId,i.ItemId),i => i.Value);
dict2[("S2","I2")].ToList() // usage example