Linq один список, чтобы выбрать несколько элементов из другого списка - PullRequest
1 голос
/ 10 октября 2019

У меня есть три класса, как показано ниже:

public class Product
{
    int id { get; set; }
    int creationDate { get; set; }
}
public class ProductList
{
    List<Product> productsList;
}

И

public class SelectedId
{
    List<int> selectedIds;
}

Теперь у меня есть 2 списка:

  1. selectedIds

  2. продуктов

    Я хочу получить каждый Product из productsList, чей Id равен значениям в selectedId в последовательности Ids, упомянутойв selectedIds.

В настоящее время я делаю что-то вроде этого:

foreach (var sID in selectedId)
{
   var product = productsList.First(x => x.id == sID);
   products.Add(product);
}

Пожалуйста, предложите лучший способ сделать то же самое.

Ответы [ 5 ]

2 голосов
/ 10 октября 2019

Вы можете попробовать IEnumerable метод расширения Присоединиться

var result = products.Join(selectedIds, p => p.id, i => i, (p, i) => p).ToList()
1 голос
/ 10 октября 2019

Вы можете использовать .Where() и .Contains() следующим образом:

var newList = productsList.Where(p => selectedIds.Contains(p.id)).ToList();

В обычном тексте это означает «получить все предметы из * 1010». * для которого идентификатор встречается в selectedIds ".

Примечание - если в selectedIds есть повторяющиеся значения, они будут "различаться", потому что мы возвращаем каждый Продукт максимум один раз. Если есть дубликаты, и вы позаботитесь о том, чтобы в результате имелись также дубликаты Продуктов (+ в том же порядке, что и все идентификаторы), тогда используйте такую ​​форму:

var newList = selectedIds.Select(id => productsList.First(p => p.id == id)).ToList();
0 голосов
/ 10 октября 2019

Можно попробовать запрос linq с помощью соединения:


    var query = from id in selectedId
                       join product in productsList on id.selectedIds equals product.id
                       select new { id  = id.id , creationDate  = product.creationDate  };

0 голосов
/ 10 октября 2019

Есть много способов добиться этого, вот один:

var selected = productsList.Where(p => selectedIds.Contains(p.id))

Вы можете использовать Any вместо Contains.

Если вы добавляете selected к другой коллекции продуктов, вы можете использовать anotherCollection.AddRange.

0 голосов
/ 10 октября 2019

попробуйте что-нибудь подобное

var productsList =productsList.Where((product) =>  selectedId.Any((id) => id == product.Id));

Решение Szymon кажется лучше, чем мое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...