Удаление элементов из списка объектов при дублировании свойства объекта - PullRequest
1 голос
/ 02 июля 2011

Я довольно новичок в linq и c #, поэтому извиняюсь, если я тупой.У меня есть запрос, который возвращает список информации о продуктах, ценах на эти продукты и категориях, в которых эти продукты основаны на некоторых переменных, переданных в:

var y = (from pl in dc.Products 
                 join pr in dc.Prices 
                 on pl.ID equals pr.ProductID 
                 join c in dc.Categories
                 on pl.ID equals c.ProductID
                 where pr.Currency == Currency  
                 && (string.IsNullOrEmpty(Cat1) || c.Cat1 == Cat1)
                 && (string.IsNullOrEmpty(Cat2) || c.Cat2 == Cat2)
                 && (string.IsNullOrEmpty(Cat3) || c.Cat3 == Cat3)
                 && (string.IsNullOrEmpty(Cat4) || c.Cat4 == Cat4)
                 && (string.IsNullOrEmpty(Cat5) || c.Cat5 == Cat5)
                 select new {pl,pr,c});

Это отлично работает, насколько это возможно, но, скажем, дляНапример, строка y имеет ID = 1 и Cat1 = Foo, а другая строка имеет ID = 1 и Cat1 = Bar, тогда очевидно, что приведенный выше запрос вернет оба.Есть ли способ изменить этот запрос так, чтобы я мог возвращать только одну строку для каждого идентификатора.

Я гуглил это в течение примерно 2 часов и пробовал групповые байсы. Различить с IEqualityComparer и другие методы, которые янашел но безуспешно.Мое понимание недостаточно, и я буду благодарен за любую помощь!

1 Ответ

1 голос
/ 02 июля 2011

Вы должны сделать это, создав HashSet, ключом которого является ваша собственность.

List<Product> distinctProducts = new List<Product>();
HashSet<string> dupSet = new HashSet<string>();
foreach (Product p in Product)
{
    if (dupSet.ContainsKey(p.Cat1))
    {
         // do not add
    }
    else
    {
         dupSet.Add(p.Cat1);
         distinctProducts.Add(p);
    }
}

Если вы хотите удалить элементы из исходного списка, вы можете использовать цикл for, начинающийся в конце (выневозможно удалить элементы из списка в цикле for).

...