如果 List<T> 包含特定的 class 数据,如何过滤它?

How to filter a List<T> if it contains specific class data?

我需要有关在 C# 中过滤列表数据的帮助。 我有 3 个 class 命名为 Product.csStorage.csInventory.cs

public class Storage{
    string StorageId;
    string Name;
}

public class Inventory{
    string InventoryId;
    string StorageId; 
    string ProductId;
}

我得到了填充的 List<Storage> mStoragesList<Product> mProductList<Inventory> mInventories

我无法打印包含只能从 mInventories.

获得的特定 productIdmStorages

所以,我尝试了这个:

List<Storage> mFilteredStorage;
for(int i=0;i<mStorages.Count;i++){
    if(mStorages[i] contain (productId from inventories)){
        mFilteredStorage.add(mstorages[i]);
}

所以我可以从库存中获取包含特定产品的 mFilteredStorage。 (在库存中有很多产品编号)。

我应该怎么做才能得到 filteredStorage?我尝试使用 list.contains() 但它只有 return 是真的,最后在 mFilteredStorage.

有重复的存储

真的需要你们的帮助。提前致谢。

我建议您阅读有关 lambda-expressions 的内容,这就是您要找的内容。

mFilteredStorage.AddRange(mStorages.Where(storage => inventories.Any(inventory => inventory.productId == storage.productId)).ToList());

这 return 为您提供了一个包含过滤条件的列表。因此,在 Where 遍历列表中的每个项目之后,我将此项目命名为 storage。 (你可以随意命名)然后我们用另一个 lambda 表达式迭代你的对象 inventories。这就是第二个 lambda 表达式,如果 inventories 的任何 productId 与 mStorages 的当前迭代对象的 productId 匹配,则 returns 为真;如果不匹配,则为假。

因此,一旦 productIds 匹配,您可以想象如下代码:

mStorages.Where(storage => true);

一旦第二个 lambda 表达式的结果为真,storage 将被添加到 IEnumerable 中,您将作为 Where 方法的结果。

由于我们得到一个 IEnumerable 作为 return,但我们想将那些 Storage 对象添加到 mFilteredStorage,我将 IEnumerable 转换为列表,作者:

/*(the return object we get from the `Where` method)*/.ToList();
mStorages.Join(mInventories, x => x.StorageId, y => y.StorageId, (x, y) => new { Storage = x, ProductId = y.ProductId})
            .Where(z => z.ProductId == "specificProductId").Select(z => z.Storage).ToList()

您可以使用 LINQ 来实现您的目标。由于 Storage 没有 ProductId,查询将匹配 StorageId

var filteredStoragesQry =
    from storage in mStorages
    where inventories.Any(inventory => inventory.StorageId == storage.StorageId)
    select storage;
mFilteredStorages = filteredStoragesQry.ToList();

此查询适用于 LINQ to 对象,但它也适用于 Entity Framework,当您将 mStoragesinventories 替换为相应的 DbSet 对象时上下文。

我以这段代码结束。

mFilteredStorage = tempStorage.GroupBy(s => s.Id).Select(group => group.First()).ToList()

这段代码就是我要展示的。