我需要有关在c#中过滤列表数据的帮助。
我得到了名为Product.cs
,Storage.cs
和Inventory.cs
的3个类。
public class Storage{
string StorageId;
string Name;
}
public class Inventory{
string InventoryId;
string StorageId;
string ProductId;
}
我已经填满了List<Storage> mStorages
,List<Product> mProduct
和List<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
处有重复的存储。
真的需要您的帮助。预先感谢。
答案 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,但是当您从上下文中将mStorages
和inventories
替换为相应的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()
这是我要显示的代码。