2012-10-11 12 views
5

şimdi bununla uğraşıyorsa.Bir <T> Listesindeki tüm öğeleri kaldırın, eğer T varyasyonları

Ayak parmağımı WebAPI dünyasına batırıyorum ve aynı adı taşıyan ancak farklı fiyatlarla ürün içeren bir Listem var. Ne yapmam gerekiyorsa, bir ürünün tüm referansları kaldırmak fiyat varyasyonları olduğunu. Örn.,

örn.
name = "Mısır gevreği" Fiyat = "1.99M"
name = "Mısır gevreği" Fiyat = "1.89M"
name = "Pirinç Krispies" Fiyat = "2.09M"
name = "Mısır gevreği" Fiyat = " 2.09M "

Hayır mısır gevreği son listemde görünmelidir.

Yazılı yığınlarım var ancak ürünleri çok yakında kaldırarak kaldırmam gereken yerlerden emin değilim.

public IEnumerable<Product> GetProductsByCategory(int Id) 
    { 
     List<Product> sourceProductList = products.Where(p => p.CategoryID == Id).ToList(); 
     List<Product> tempProducts = new List<Product>(); 
     List<Product> targetProductList = new List<Product>(); 

     foreach (var product in sourceProductList) 
     { 
      bool isInTempList = tempProducts.Any(x => x.Name == product.Name); 
      if (!isInTempList) 
      { 
       tempProducts.Add(product); 
      } 
      else 
      { 
       Product tempProduct = product; 
       bool isPriceDifferent = tempProducts.Where(y => y.Name == tempProduct.Name).Any(y => y.Price != tempProduct.Price); 
       if (isPriceDifferent) 
       { 
        tempProducts.RemoveAll(p => p.Name == product.Name); 
        // too soon as I may have lots of products with the same name 
        // but need to remove based on product.Name 
       } 
      } 
     } 
     targetProductList.AddRange(tempProducts); 

     return targetProductList; 
    } 

Herhangi bir yardım büyük memnuniyetle karşılanacaktır.

Not: diğer hububat

+0

@MarkByers ben asla olmayacak emin oldum. – Brett

cevap

2

bu deneyin:

class Program 
    { 
     static void Main(string[] args) 
     { 
      var list = new List<Product> 
       { 
        new Product() {Name = "Cornflakes", Price = 100}, 
        new Product() {Name = "Cornflakes", Price = 200}, 
        new Product() {Name = "Rice Krispies", Price = 300}, 
        new Product() {Name = "Cornflakes", Price = 400} 
       }; 

      var uniqueItems = list.Where(w => (!list.Any(l=>l.Name.Equals(w.Name) && l != w))); 

     } 

     public class Product 
     { 

      public string Name { get; set; } 
      public decimal Price { get; set; } 
     } 
    } 

Sonuçta sadece bir "Pirinç Krispies" ürününüz olacak. Eminim GroupBy ve Distinct ile çözümden daha hızlı çalışacağından eminim çünkü bu gereksiz şeyleri sizin durumunuzda yapmamız gerekmiyor.

Çalışma Kodu - http://ideone.com/X8A3v

12

tek farklı fiyat var ürünler seçecektir bu LINQ ifadesini deneyin mevcuttur:

var result = sourceProductList 
    .GroupBy(x => x.Name) 
    .Where(g => g.Select(x => x.Price).Distinct().Count() == 1) 
    .Select(g => g.First()); 

çevrimiçi çalışır duruma bakınız: ideone. Böyle

+0

Harika! Bunun için teşekkürler, benim LINQ biraz daha fazla fırça gerekir gibi görünüyor. – Brett

1

şey (serbest el yüzden biraz yanlış sözdizimi olabilir):

var toRemove = sourceProductList 
    .GroupBy(p => p.Name) 
    .Where(g => g.Count() > 1) 
    .SelectMany(g => g) 
    .GroupBy(p => p.Price) 
    .Where(g => g.Count() > 1) 
    .SelectMany(g => g.Select(p => p.ID)) 
    .Distinct() 
    .ToList(); 
toRemove.ForEach(id => sourceProductList.RemoveAll(p => p.ID == id)); 
1

Bu alma, adıyla gruplama kadar kolay olmalı sadece bu sadece 1 öğe gruplarında var burada:

var filtered = list.GroupBy(i => i.Name) 
     .Where(i => i.Count() == 1) 
     .SelectMany(x => x) 

Canlı örnek: http://rextester.com/AUBOHU96105

İlgili konular