2012-10-11 20 views
5

कुछ समय से संघर्ष कर रहा है, तो सूची से सभी आइटम हटाएं। किसी सूची के लिए

मैं वेबएपीआई दुनिया में अपने पैर की अंगुली को डुबो रहा हूं और मेरे पास एक सूची है जिसमें एक ही नाम के साथ उत्पादों को शामिल किया जा सकता है लेकिन अलग-अलग कीमतें हैं। मुझे क्या करना है सभी किसी उत्पाद के संदर्भों को मूल्य में भिन्नता है।

उदाहरण के लिए।
नाम = "कॉर्नफ़्लेक्स" मूल्य = "1.99M"
नाम = "कॉर्नफ़्लेक्स" मूल्य = "1.89M"
नाम = "चावल Krispies" मूल्य = "2.09M"
नाम = "कॉर्नफ़्लेक्स" मूल्य = " 2.0 9 एम "

नहीं कॉर्नफ्लेक्स मेरी अंतिम सूची में दिखाई देना चाहिए।

मुझे थोक लिखा गया है लेकिन यह जल्द ही उत्पादों को हटा रहा है और मुझे यकीन नहीं है कि मुझे उन्हें हटाया जाना चाहिए।

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

परिणामस्वरूप आपके पास केवल एक "चावल Krispies" आइटम होगा। मुझे यकीन है कि यह ग्रुपबी और डिस्टिंट के साथ समाधान से तेज़ काम करेगा, क्योंकि हमें आपके मामले में इन अनावश्यक चीजों को करने की आवश्यकता नहीं है।

कार्य कोड - http://ideone.com/X8A3v

12

इस 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

संबंधित मुद्दे