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

时间:2018-10-19 07:29:44

标签: c# generic-list

我需要有关在c#中过滤列表数据的帮助。 我得到了名为Product.csStorage.csInventory.cs的3个类。

public class Storage{
    string StorageId;
    string Name;
}

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

我已经填满了List<Storage> mStoragesList<Product> mProductList<Inventory> mInventories

我在打印包含特定mStorages且只能从productId获得的mInventories时遇到麻烦。

所以,我尝试了这个:

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

因此,我可以从库存中获取包含特定产品的mFilteredStorage。 (库存中有很多产品ID)。

我应该怎么做才能得到filteredStorage?我尝试使用list.contains(),但它只返回true,最后在mFilteredStorage处有重复的存储。

真的需要您的帮助。预先感谢。

4 个答案:

答案 0 :(得分:1)

我建议您阅读有关lambda-expressions的信息,这就是您想要的。

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

这将向您返回包含过滤条件的列表。因此,在Where遍历列表中的每个项目之后,我将其称为storage。 (您可以命名任何名称)然后我们使用另一个lambda表达式遍历您的对象inventories。这是第二个lambda表达式,如果inventories的productId中的任何一个与mStorages的当前迭代对象的productId相匹配,则返回true;否则,则返回false。

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

mStorages.Where(storage => true);

当第二个lambda表达式的结果为true时,storage将被添加到IEnumerable中,作为Where方法的结果。

由于我们获得了IEnumerable作为回报,但是我们想将这些Storage对象添加到mFilteredStorage中,因此我可以通过以下方式将IEnumerable转换为列表:

/*(the return object we get from the `Where` method)*/.ToList();

答案 1 :(得分:1)

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

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

此查询用于对象的LINQ,但是当您从上下文中将mStoragesinventories替换为相应的DbSet对象时,该查询也将在Entity Framework中工作。

答案 2 :(得分:0)

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()

答案 3 :(得分:0)

我以这段代码结束。

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

这是我要显示的代码。