2012-10-11 7 views
5

になってしまった場合は、リスト からすべてのアイテムを削除してください。 Tのバリエーションが

私はWebAPIの世界に自分の足を浸しています。私は同じ名前で価格が異なる製品を含むリストを持っています。私がする必要があるのは削除することですすべての商品への言及は価格の変動が生じます。

例えば、
名= "コーンフレーク" 価格= "1.99M"
名= "コーンフレーク" 価格= "1.89M"
名= "ライスクリスピー" 価格= "2.09M"
名= "コーンフレーク" 価格= " 2.09M "

いいえ最終リストに表示されます。

私は一括書かれているが、それはあまりにもすぐに製品を削除していると私はそれらを削除する必要があります私は確信しています。

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; 
    } 

ご協力いただければ幸いです。

注:他の穀物が用意されてい

+0

@MarkByers私は決して起こらないことが保証されてきました。 – Brett

答えて

2

これを試してください:

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; } 
     } 
    } 

この結果、「ライスクリスピー」アイテムは1つしかありません。私たちがあなたのケースでこれらの不必要なことをする必要がないので、GroupByとDistinctのソリューションよりも速く動作すると確信しています。

ワーキングコード - http://ideone.com/X8A3v

12

だけ1つの異なる価格を持っている製品を選択します。このLINQ式を試してみてください。

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

それがオンラインで作業を参照してください:ideone

+0

驚くばかり!ありがとう、私はLINQをもう少し詳しく調べる必要があるようです。 – Brett

1

このような何か(フリーハンドは多少間違った構文でもよい):

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

これが唯一の1つの項目がグループに存在する場合のみを取得し、名前でグループ化するのと同じくらい簡単でなければなりません:

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

ライブ例:http://rextester.com/AUBOHU96105

関連する問題