Как выбрать дублирующиеся предметы - PullRequest
2 голосов
/ 05 марта 2020

У меня проблема с

IEnumerable<SelectedProductRequest> selectedProducts = {
new SelectedProductRequest {id = 4, Name = "product1", Price = 23},
new SelectedProductRequest {id = 4, Name = "product1", Price = 44},
new SelectedProductRequest {id = 5, Name = "product2", Price = 11}
}

List<MyProducts> myProducts= {
new MyProducts{id = 4, Name = "product1", isExcl= true},
new MyProducts{id = 5, Name = "product2", isExcl= false}
}

IEnumerable<SelectedProductViewModel> products = myProducts
      .Select(product => new SelectedProductViewModel(
                            product.Name,
                            selectedProducts.FirstOrDefault(selectedProduct => selectedProduct.id== product.id)?.Price ?? 0,
                            product.IsExclusive))
                        .OrderByDescending(product => product.id)))

Продукты должны возвращать:

products= {
new SelectedProductRequest {id = 4, Name = "product1", Price = 23, IsExclusive = true},
new SelectedProductRequest {id = 4, Name = "product1", Price = 44, IsExclusive = true},
new SelectedProductRequest {id = 5, Name = "product2", Price = 11, IsExclusive = false}
}

Что я получаю:

products= {
new SelectedProductRequest {id = 4, Name = "product1", Price = 23, IsExclusive = true},
new SelectedProductRequest {id = 5, Name = "product2", Price = 11, IsExclusive = false}
}

И это из-за FirstOrDefault , у вас есть идеи, как мне достичь желаемого результата?

Ответы [ 2 ]

0 голосов
/ 05 марта 2020

Исходя из показанного linq, вы получите то, что ожидаете. Вы вызываете select для коллекции из 2 элементов, поэтому 2 элемента будут перезапущены

. Используйте Linq Join для идентификатора, чтобы получить желаемый результат.

IEnumerable<SelectedProductViewModel> products = myProducts
    .Join(selectedProducts, product => product.id, selected => selected.id, (product, selected) =>
        new SelectedProductViewModel(product.Name, selected?.Price ?? 0, product.IsExclusive)
    );

Учитывая, что идентификатор не является Переданный в модель представления, заказ должен быть выполнен до объединения.

0 голосов
/ 05 марта 2020

Вы можете попробовать дополнительно выполнить итерацию по начальному массиву вместо FirstOrDefault:

IEnumerable<SelectedProductViewModel> products = myProducts
                .Select(product => selectedProducts.Where(selectedProduct => selectedProduct.id == product.id).Select(
                    resultProduct => new SelectedProductViewModel(
                        product.Name,
                        resultProduct?.Price ?? 0,
                        product.isExcl)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...