如何使用另一个列表<int>将List <myclass>查询到新的List <myclass>中

时间:2017-10-02 07:27:46

标签: c# linq

我有两个清单:

static List<Parts> partList = new List<Parts>();

它所指的类:

class Parts
{
    int chassisNumber;

    public int ChassisNumber
    {
        get { return chassisNumber; }
        set { chassisNumber = value; }
    }

    int partsCount;

    public int PartsCount
    {
        get { return partsCount; }
        set { partsCount = value; }
    }

另一个:

static List<int> shuffledChassisList = new List<int>();

shuffledChassisList包含加载到List ChassisNumber中的机箱号的子集。 我想使用shuffledChassisList将List查询到一个新列表,例如:List filteredPartList。

我尝试使用Linq但未能编写一个可以创建包含过滤结果的新列表的工作解决方案。

然后,我想使用此过滤列表根据部件号计数将部件分类到新列表中(例如:我想将List filteredPartList中的所有部件复制到List emptyPackageList,其中Part的partsCount为0)。

到目前为止,我得到了这个,但不确定在foreach循环中写什么:

static List<Parts> emptyPackageList = new List<Parts>();

var emptyPackage = filteredPartList.Where(p => p.partsCount == 0);

foreach (var part in emptyPackage)
{
    emptyPackageList.Add(new Parts(??));
}

如果可以编写一个执行这两个方法的方法,那对我来说没问题。

修改 我需要有两个列表的原因是因为我查询数据库以获取底盘编号和属于它的零件计数。我问社区,但不幸的是,似乎无法使此查询在选定的机箱号上运行。所以我有所有chassisnumbers(List<Parts> partList)的partscount,我需要使用我要查找的那些(List<int> shuffledChassisList)进行过滤,然后按partscount分组到新列表中。

如果可以或更容易通过List<Parts> partList过滤List<int> shuffledChassisList然后按partsCount的结果进行过滤,然后将零件复制到几个新列表中,那么它也是可接受的解决方案。< / p>

2 个答案:

答案 0 :(得分:2)

您的类没有指定构造函数,因此只有默认构造函数。要使用数据填充新实例,请使用对象初始值设定项语法:

var emptyPackage = filteredPartList.Where(p => p.partsCount == 0);
foreach (var part in emptyPackage)
{
    emptyPackageList.Add(new Parts { ChassisNumber = part.ChassisNumber, PartsCount = part.PartsCount } );
}

如果已经使用linq,则使用.Select投影新实例:

var emptyPackage = filteredPartList.Where(p => p.partsCount == 0)
                                   .Select(p => new Parts {
                                       ChassisNumber = part.ChassisNumber, 
                                       PartsCount = part.PartsCount 
                                   }).ToList();

请注意,在实例化新对象并设置其属性时,这会创建对象的深层副本。如果浅拷贝就足够了,那么:

var emptyPackage = filteredPartList.Where(p => p.partsCount == 0).ToList();

另外请考虑以下事项:

  1. 作为您的物业&#39;实现是默认的,使用自动属性:

    class Parts
    {
        public int ChassisNumber { get; set; }
        public int PartsCount { get; set; }
    } 
    
  2. 实现复制构造函数或IClonable接口,然后:

    //copy constructor
    filteredPartList.Where(p => p.partsCount == 0).Select(p => new Parts(p));
    //clone
    filteredPartList.Where(p => p.partsCount == 0).Select(p => p.Clone());
    
  3. 如果我理解了您的更新,那么:

    var result = filteredPartList.Where(p => p.partsCount == 0 && 
                                             shuffledChassisList.Contains(p.ChassisNumber))
                                 .GroupBy(p => partsCount)
                                 .ToList();
    

    另请考虑将shuffledChassisList更改为HashSet<int>,以便Contains成为O(1)操作,而不是O(n)

答案 1 :(得分:1)

也许我没有得到你的正确意图,但这是你可以做的:

如果您有零件清单,并希望按PartsCount对其进行分类:

smtplib.SMTP_SSL()

如果你想从一个列表中获取所有项目,如果id属于另一个列表:

var categorized = myList.GroupBy(p=>p.PartsCount, p=>p);

也许通过结合两种方法,你可以得到你想要的东西(这对我来说仍然有点不清楚)