返回不在前两个列表中的元素列表

bn31dyow  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(261)

我有两个ID列表,我需要返回一个列表,其中包含不在这些列表中的产品:

public IEnumerable<Produto> GetProdutosIdNotInFamily(Guid produtoId)
        {
            var produtosPai = GetListaPaisId(produtoId);

            var produtosFilho = GetListaFilhosId(produtoId);

            var prod = _dbContext.Produtos
                         .Where(u => !produtosPai.Any(p => p.ProdutoFilhoId == u.Id)
                               && !produtosFilho.Any(p => p.ProdutoFilhoId == u.Id));

            return prod;
        }
pwuypxnk

pwuypxnk1#

你可以用两种方法来实现这一点——一种是使用 Contains 以及其他用途 Any 就像你在帖子里提供的。

使用contains方法

如果你想用 Contains() 方法时,您可能会将所有产品标识提取到一个集合中,并在其上应用linq,然后获取不属于两个引用列表的列表。示例代码如下所示

// This is the sample model I am dealing with
public class Dummy
{
    public int Id { get; set; }
    public string Name { get; set; }
}

// Assuming the below call returns list of 'Dummy' objects
var products = _dbContext.Produtos;

// list1 & list2 are populated in your case already through the method calls
var exclusionList1 = list1.Select(x => x.Id).ToList<int>();
var exclusionList2 = list2.Select(x => x.Id).ToList<int>();

var myList = products.Where(x => !exclusionList1.Contains(x.Id) && !exclusionList1.Contains(x.Id)).ToList();
``` `Contains` 是一个示例方法,将对象作为参数,时间复杂度取决于使用此方法的集合。

#### 使用任何

就像 `Where` ,  `Any` 是一个扩展方法。它将委托作为一个参数,使您能够更灵活地控制您想要做的事情。
应用 `Any` 您的场景如下所示:

var products = _dbContext.Produtos;

var exclusionList1 = GetListaPaisId(produtoId);
var exclusionList2 = GetListaFilhosId(produtoId);

var prod = _dbContext.Produtos.Where(x => !exclusionList1.Any(z => x.Id == z.Id) &&
!exclusionList2.Any(z => x.Id == z.Id)).ToList();

您可以根据执行此操作的上下文选择方法。

相关问题