如何:选择不同的对象< >从多个列表具有1个或多个相同类型的属性

本文关键字:同类型 属性 具有 1个 选择 如何 对象 列表 | 更新日期: 2023-09-27 18:02:23

这是一个困扰我几个小时的设计问题,我不得不向团队寻求帮助。我有一个包含数千个共享实体的集合,并且需要从包含在两个列表中的三个不同属性、Stores列表中的两个管理器和仓库集合中的一个管理器中检索不同的管理器列表。

为了简化这个问题,我编写了一个简单的控制台程序来突出这个挑战。我把它们放在一起,所以,是的,我知道这是低效的,但它显示了问题:

    public class Program
    {
        static void Main(string[] args)
        {
            DistributionGroup d = new DistributionGroup();
            Console.WriteLine("====Store Managers====");
            foreach(Manager m in d.Stores.Select(m => m.StoreManager).Distinct())
            {
                Console.WriteLine("{0}:{1}", m.Id, m.Name);
            }
            Console.WriteLine("=====Inv. Managers=====");
            foreach (Manager m in d.Stores.Select(m => m.InventoryManager).Distinct())
            {
                Console.WriteLine("{0}:{1}", m.Id, m.Name);
            }
            Console.WriteLine("===Warehouse Managers===");
            foreach (Manager m in d.Warehouses.Select(m => m.WarehouseManager).Distinct())
            {
                Console.WriteLine("{0}:{1}", m.Id, m.Name);
            }                
        }
    }
    public class DistributionGroup
    {
        private Manager m1 = new Manager(1, "Bob Wilson");
        private Manager m2 = new Manager(2, "Chris Warren");
        private Manager m3 = new Manager(3, "Mike Olsen");
        private Manager m4 = new Manager(4, "Aaron Erikson");
        public List<RetailStore> Stores;
        public List<Warehouse> Warehouses;
        public DistributionGroup()
        {
            RetailStore s1 = new RetailStore(1, m1, m1);
            RetailStore s2 = new RetailStore(2, m1, m3);
            RetailStore s3 = new RetailStore(3, m2, m2);
            Warehouse w1 = new Warehouse(1, m4);
            Warehouse w2 = new Warehouse(2, m2);
            Stores = new List<RetailStore>();
            Stores.Add(s1);
            Stores.Add(s2);
            Stores.Add(s3);
            Warehouses = new List<Warehouse>();
            Warehouses.Add(w1);
            Warehouses.Add(w2);
        }
    }
    public class Manager
    {
        public int Id;
        public string Name;
        public Manager(int id, string name)
        {
            Id = id; Name = name;
        }
    }
    public class RetailStore
    {
        public int Id;
        public Manager StoreManager;
        public Manager InventoryManager;
        public RetailStore(int id, Manager mgr, Manager inventoryMgr)
        {
            Id = id;
            StoreManager = mgr;
            InventoryManager = inventoryMgr;
        }
    }
    public class Warehouse
    {
        public int Id;
        public Manager WarehouseManager;
        public Warehouse(int id, Manager mgr)
        {
            Id = id;
            WarehouseManager = mgr;
        }
    }

我需要做的是从这三个属性中生成一个不同的manager列表:

  1. RetailStore。StoreManager
  2. RetailStore。InventoryManager
  3. 仓库。WarehouseManager

因此,按照示例,控制台输出将简单地为:

1:鲍勃威尔逊
2:克里斯·沃伦
3:迈克·奥尔森
4:Aaron Erikson

我一直在努力弄清楚语法,但LINQ不是我的强项,我希望小组能帮助我。

如何:选择不同的对象< >从多个列表<T>具有1个或多个相同类型的属性

似乎您需要使用Enumerable。结合

var allManagers = d.Stores.Select(m => m.StoreManager).Union(d.Stores.Select(m => m.InventoryManager))
                                                      .Union(d.Warehouses.Select(m => m.WarehouseManager));
foreach (Manager m in allManagers)
{
    Console.WriteLine("{0}:{1}", m.Id, m.Name);
}   

注意,Union从输入序列返回唯一值,因此不需要调用Distinct