1

我有一个 C# 类,我们称之为Item类。Item类具有以下属性。

 Name
 Region
 Value

我有 4 个列表,其中包含多个类型的对象item。清单之一是主清单。

以下是MasterList的内容

Name    Region       Value
A       Global       10
B       Global       20
C       Global       30
D       Global       40
E       Global       50
F       Global       60
G       Global       70
H       Global       80
I       Global       90
J       Global       100

以下是USAList的内容

Name    Region       Value
G       USA          50
H       USA          50
I       USA          50
J       USA          50
A       USA          50

以下是UKList的内容

Name    Region       Value
A       UK          20
B       UK          20
C       UK          20
D       UK          20
F       UK          20

以下是EUList的内容

Name    Region       Value
A       EU          30
B       EU          30
D       EK          30
G       EK          30
I       EK          30

任何列表都可以包含任意数量的项目。主列表将包含所有项目。一个项目在列表中只能出现一次。列表中的项目可能会或可能不会(按名称)排序。

我想从所有列表中查找项目,假设主列表包含所有项目。我需要按名称查找项目并创建一个应该如下所示的新列表。

Name   GlobalValue     USAValue      UKValue      EUValue
A      10              50             20             30
B      20                             20             30 
C      30                             20
D      40                             20             30
E      50
F      60                             20
G      70              50                            30
H      80              50 
I      90              50                            30
J      100             50

我知道我可以创建一个具有以下属性的新类。

Name, GlobalValue, USAValue, UKValue, EUValue

然后我可以开始一个循环来遍历主列表并在这个循环内,我将再运行 3 个循环。USAList 一份,UKList 一份,EUList 一份。然后我会尝试按名称查找项目,然后创建新列表。

但我想知道获得所需结果的最有效方法。

演示课程和列表

public class Item
    {
        public string Name { get; set; }
        public string Region { get; set; }
        public string Value { get; set; }
    }

列表

List<Item> MasterList = new List<Item>();
            MasterList.Add(new Item {Name = "A", Region = "Global", Value = "10"});
            MasterList.Add(new Item {Name = "B", Region = "Global", Value = "20"});
            MasterList.Add(new Item {Name = "C", Region = "Global", Value = "30"});
            MasterList.Add(new Item {Name = "D", Region = "Global", Value = "40"});
            MasterList.Add(new Item {Name = "E", Region = "Global", Value = "50"});
            MasterList.Add(new Item {Name = "F", Region = "Global", Value = "60"});
            MasterList.Add(new Item {Name = "G", Region = "Global", Value = "70"});
            MasterList.Add(new Item {Name = "H", Region = "Global", Value = "80"});
            MasterList.Add(new Item {Name = "I", Region = "Global", Value = "90"});
            MasterList.Add(new Item {Name = "J", Region = "Global", Value = "100"});

            List<Item> USAList = new List<Item>();
            USAList.Add(new Item { Name = "G", Region = "USA", Value = "50" });
            USAList.Add(new Item { Name = "H", Region = "USA", Value = "50" });
            USAList.Add(new Item { Name = "I", Region = "USA", Value = "50" });
            USAList.Add(new Item { Name = "J", Region = "USA", Value = "50" });
            USAList.Add(new Item { Name = "A", Region = "USA", Value = "40" });

            List<Item> UkList = new List<Item>();
            UkList.Add(new Item { Name = "A", Region = "UK", Value = "20" });
            UkList.Add(new Item { Name = "B", Region = "UK", Value = "20" });
            UkList.Add(new Item { Name = "C", Region = "UK", Value = "20" });
            UkList.Add(new Item { Name = "D", Region = "UK", Value = "20" });
            UkList.Add(new Item { Name = "F", Region = "UK", Value = "20" });

            List<Item> EUList = new List<Item>();
            EUList.Add(new Item { Name = "A", Region = "EU", Value = "30" });
            EUList.Add(new Item { Name = "B", Region = "EU", Value = "30" });
            EUList.Add(new Item { Name = "G", Region = "EU", Value = "30" });
            EUList.Add(new Item { Name = "G", Region = "EU", Value = "30" });
            EUList.Add(new Item { Name = "I", Region = "EU", Value = "30" });
4

1 回答 1

1

在您提供的示例代码中,您将所有项目添加到 masterlist 而不是其他列表,但巧合的是,这可能是最有效的方法:连接列表并使用 aGroupBy而不是多个连接:

    var list = (from i in MasterList.Concat(USAList).Concat(UkList).Concat(EUList) //concat all lists
            group i by i.Name into g //primary group by on Name
            let d = (IDictionary)g.GroupBy(si=>si.Region).ToDictionary(gr => gr.Key, gr=> gr.Sum(v=>int.Parse(v.Value))) //create a dictionary of regions with the sums as values
            select new {Name = g.Key, GlobalValue = d["Global"], USAValue = d["USA"],  UKValue = d["UK"],   EUValue = d["EU"]}).ToList();

您可以添加值字典本身,而不是单独的字段。还要注意演员表(IDictionary)。'IDictionary' 索引的实现与通用索引的直接索引不同:后者对不在字典中的索引抛出异常。

用于测试:dotnetfiddle

于 2016-07-21T17:50:32.230 回答