微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。