Как отфильтровать список <T>, если он содержит данные определенного класса? - PullRequest
0 голосов
/ 19 октября 2018

Мне нужна помощь с фильтрацией данных списка в c #.Я получил 3 класса с именами 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.

У меня естьпроблема с печатью 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 который содержит конкретный продукт из запасов.(в запасах много идентификаторов продуктов).

Что мне сделать, чтобы получить это filteredStorage?Я пытался использовать list.contains(), но он возвращает только true и, наконец, в mFilteredStorage.

есть дублированное хранилище. Очень нужна ваша помощь, ребята.Заранее спасибо.

Ответы [ 4 ]

0 голосов
/ 22 октября 2018

Я закончил с этим кодом.

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

Этот код я хочу показать.

0 голосов
/ 19 октября 2018
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()
0 голосов
/ 19 октября 2018

Вы можете использовать LINQ для достижения своей цели.Поскольку Storage не имеет ProductId, запрос будет соответствовать StorageId.

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

Этот запрос относится к LINQ для объектов, но он также будет работать в Entity Framework, когда вы замените * 1007.* и inventories соответствующими DbSet объектами из контекста.

0 голосов
/ 19 октября 2018

Я предлагаю вам прочитать о лямбда-выражениях , это то, что вы ищете.

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

Это вернет вам список с вашими отфильтрованными условиями.Итак, сразу после Where вы перебираете каждый элемент в вашем списке, я назвал этот элемент storage.(вы можете назвать их как хотите) Затем мы перебираем ваш объект inventories с помощью другого лямбда-выражения.Это, второе лямбда-выражение, возвращает либо true, если любой из inventories productIds совпадает с productId текущего итерирующего объекта mStorages, либо false, если они не совпадают.

Так что вы однаждыСоответствие productIds позволяет представить код, подобный следующему:

mStorages.Where(storage => true);

И как только результат второго лямбда-выражения станет истинным, storage будет добавлен к IEnumerable, который вы получите в результатеWhere метод.

Поскольку мы получаем IEnumerable в качестве возврата, но мы хотим добавить эти Storage объекты в mFilteredStorage, я преобразую IEnumerable в список, с помощью:

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