LINQ / C#从列表中删除其他多个列表中的所有项目 我想显示所有未分类的产品

问题描述

我有以下设置:

  • 1个列表,其中包含约500种产品。

  • 1个分类列表,每个分类包含产品列表(在分类内部)和一些其他属性

我的模型看起来像这样(简化):

public Model() {
   public List<Products> {get; set;}
   public List<Assortment> {get; set;}
}

分类看起来像这样(简化)

public Assortment() {
   public int ID {get; set;}
   public string Name {get; set;}
   public List<Product> Products {get; set;
}

我想显示所有未分类的产品

我尝试过这样的事情:

Model.Products.Except(x => Model.Assortments.Where(y => y.Products.Contains(x)).Select(z => z.Products).ToList()

但是编译器告诉我

“ Lambdaexpression”无法转换为类型 “ IEnumerable”,因为它不是委托类型

(从德语翻译成英语)

我也使用RemoveAll或Where尝试了一些操作,但是我无法使其正常工作。

解决方法

使用SelectMany,您可以获取所有分类的所有产品

Model.Products.Except(Model.Assortments.SelectMany(a => a.Products))

因此没有分类的产品是:

Equals

正如@GuruStron在评论中指出的那样,这假定可以将分类中的产品与Products集合中的产品进行标识,因为它们是同一对象,或者可以通过适当的import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( home: SampleApp(),debugShowCheckedModeBanner: false,); } } class SampleApp extends StatefulWidget { @override _SampleAppState createState() => _SampleAppState(); } class _SampleAppState extends State<SampleApp> { RangeValues _currentRangeValues = RangeValues(18,60); dialog(BuildContext context) { showDialog( context: context,builder: (BuildContext context) { return StatefulBuilder(builder: (thisLowerContext,innerSetState) { return Dialog( child: Container( width: double.infinity,height: 300,child: RangeSlider( values: _currentRangeValues,min: 18.0,max: 60.0,divisions: 1,labels: RangeLabels( _currentRangeValues.start.round().toString(),_currentRangeValues.end.round().toString(),),onChanged: (RangeValues values) { innerSetState(() { _currentRangeValues = values; }); },); }); },); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Your heading'),body: RaisedButton( child: Text('press'),onPressed: () { dialog(context); },)); } } 覆盖。