【问题标题】:LINQ Convert List of items to Lookup of rows with redundant valuesLINQ 将项目列表转换为具有冗余值的行的查找
【发布时间】:2021-05-08 19:35:17
【问题描述】:

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

我有这门课

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",
    },
    new ItemValue
    {
        SetId = "S1",
        ItemId = "I3",
        Value = "S1I3V",
    },
    new ItemValue
    {
        SetId = "S2",
        ItemId = "I1",
        Value = "S2I1V",
    },
    new ItemValue
    {
        SetId = "S2",
        ItemId = "I2",
        Value = "S2I2V1",
    },
    new ItemValue
    {
        SetId = "S2",
        ItemId = "I2",
        Value = "S2I2V2",
    },
    new ItemValue
    {
        SetId = "S2",
        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" },
    },
    ["S2"] = new Dictionary<string, string>() 
    {
        { ["I1"] = "S2I1V" },
        { ["I2"] = "S2I2V2" },
        { ["I3"] = "S2I3V" },
    }
};

我自己并不擅长 LINQ,在一些不成功的 LINQ 试验和使用一堆 foreach 和 if 的丑陋解决方案之后,我现在联系您,请您对此有所了解。

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

非常感谢您!...

【问题讨论】:

    标签: c# linq dictionary mapping ienumerable


    【解决方案1】:

    你可以用 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
    

    【讨论】:

    • 感谢您的回复。这个解决方案的问题是我不知道“I2”是否会有 2 个(或更多)值或“I3”或“I2”和“I3”......所以从技术上讲,我需要复制整个设置重复值的位置,因为这稍后将是一个excel文件的一行......我相信我应该在某个地方有一些“加入”来进行复制,但到目前为止我已经失败了......再次感谢你:)
    猜你喜欢
    • 2020-01-17
    • 2022-01-19
    • 2018-04-24
    • 1970-01-01
    • 1970-01-01
    • 2012-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多