如果 List<T> 包含特定的 class 数据,如何过滤它?
How to filter a List<T> if it contains specific class data?
我需要有关在 C# 中过滤列表数据的帮助。
我有 3 个 class 命名为 Product.cs
、Storage.cs
和 Inventory.cs
。
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
。
我无法打印包含只能从 mInventories
.
获得的特定 productId
的 mStorages
所以,我尝试了这个:
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,当您将 mStorages
和 inventories
替换为相应的 DbSet
对象时上下文。
我以这段代码结束。
mFilteredStorage = tempStorage.GroupBy(s => s.Id).Select(group => group.First()).ToList()
这段代码就是我要展示的。
我需要有关在 C# 中过滤列表数据的帮助。
我有 3 个 class 命名为 Product.cs
、Storage.cs
和 Inventory.cs
。
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
。
我无法打印包含只能从 mInventories
.
productId
的 mStorages
所以,我尝试了这个:
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,当您将 mStorages
和 inventories
替换为相应的 DbSet
对象时上下文。
我以这段代码结束。
mFilteredStorage = tempStorage.GroupBy(s => s.Id).Select(group => group.First()).ToList()
这段代码就是我要展示的。