2015-02-13 2 views
0

Вопрос: У меня есть список элементов, которые мне нужны для первой группы, а затем подгруппы по количеству элементов в вашей группе продуктов. Код ниже. Цель состоит в том, чтобы создать соответствующие группы, в которых зоны и продукты доступны в каждом матче. Зона и продукт могут быть изменены, но количество доступных продуктов всегда должно быть сгруппировано.C# Linq запрос к группам по группам, а затем подгруппа

например. учитывая ниже ...

Результат должен быть ...

Group 1 
Zone = "EAST", Product = "Bananas", ShippingTime = "3_Days" }; 
Zone = "EAST", Product = "Oranges", ShippingTime = "5_Days" }; 
Zone = "SOUTH", Product = "Bananas", ShippingTime = "3_Days" }; 
Zone = "SOUTH", Product = "Oranges", ShippingTime = "10_Days" }; 

Группа 2

Zone = "WEST", Product = "Oranges", ShippingTime = "3_Days" }; 
Zone = "WEST", Product = "Oranges", ShippingTime = "5_Days" }; 
Zone = "WEST", Product = "Oranges", ShippingTime = "10_Days" }; 
Zone = "WEST", Product = "Apples", ShippingTime = "3_Days" }; 
Zone = "WEST", Product = "Apples", ShippingTime = "5_Days" }; 
Zone = "WEST", Product = "Apples", ShippingTime = "5_Days" }; 
Zone = "WEST", Product = "Bananas", ShippingTime = "3_Days" }; 
Zone = "WEST", Product = "Bananas", ShippingTime = "5_Days" }; 
Zone = "WEST", Product = "Bananas", ShippingTime = "5_Days" }; 

Идеальная группировка будет вспыхивать ниже из группы 2 (CAUS' они совпадают то, что в 1-й группе) и добавить к 1-й группе, в результате чего остаточная в группе 2.

Zone = "WEST", Product = "Bananas", ShippingTime = "3_Days" }; 
Zone = "WEST", Product = "Oranges", ShippingTime = "10_Days" }; 

Вот тест, с которым я работал. Ничто из того, что я мог сделать с linq, похоже, не выполнило свою работу. Спасибо, что за идеи.

public void should_group_products_and_shippingtimes() 
     { 
      { 
       Bananas = "Limited DR"; 
       var a = new MyClass { Id = 1, Zone = "EAST", Product = "Bananas", ShippingTime = "3_Days" }; 
       var b = new MyClass { Id = 2, Zone = "EAST", Product = "Oranges", ShippingTime = "5_Days" }; 
       var c = new MyClass { Id = 3, Zone = "SOUTH", Product = "Bananas", ShippingTime = "3_Days" }; 
       var d = new MyClass { Id = 4, Zone = "SOUTH", Product = "Oranges", ShippingTime = "10_Days" }; 
       var e = new MyClass { Id = 5, Zone = "WEST", Product = "Oranges", ShippingTime = "3_Days" }; 
       var f = new MyClass { Id = 6, Zone = "WEST", Product = "Oranges", ShippingTime = "5_Days" }; 
       var g = new MyClass { Id = 7, Zone = "WEST", Product = "Oranges", ShippingTime = "10_Days" }; 
       var h = new MyClass { Id = 8, Zone = "WEST", Product = "Apples", ShippingTime = "3_Days" }; 
       var i = new MyClass { Id = 9, Zone = "WEST", Product = "Apples", ShippingTime = "5_Days" }; 
       var j = new MyClass { Id = 10, Zone = "WEST", Product = "Apples", ShippingTime = "5_Days" }; 
       var k = new MyClass { Id = 11, Zone = "WEST", Product = "Bananas", ShippingTime = "3_Days" }; 
       var l = new MyClass { Id = 12, Zone = "WEST", Product = "Bananas", ShippingTime = "5_Days" }; 
       var m = new MyClass { Id = 13, Zone = "WEST", Product = "Bananas", ShippingTime = "5_Days" }; 
       var myList = new List<MyClass>(); 
       myList.AddRange(new[] {a,b,c,d,e,f,g,h,i,j,k,l,m}); 

       var sublist = (from ee in myList 
               from ff in myList 
               where ee.Product == ff.Product 
                 && ee.Id != ff.Id 
               select ee).Distinct(); 

       var match1 = 
         myList.AsEnumerable().GroupBy(
          record => 
          new { PRODUCT = record.Product, SHIPPINGTIME = record.ShippingTime }).Where(z => z.Count() == 1); 

       var match2 = 
         myList.AsEnumerable().GroupBy(
          record => 
          new { PRODUCT = record.Product, SHIPPINGTIME = record.ShippingTime }).Where(z => z.Count() == 2); 

       var match3 = 
         myList.AsEnumerable().GroupBy(
          record => 
          new { PRODUCT = record.Product, SHIPPINGTIME = record.ShippingTime }).Where(z => z.Count() == 3); 

       var match4 = 
         myList.AsEnumerable().GroupBy(
          record => 
          new { PRODUCT = record.Product, SHIPPINGTIME = record.ShippingTime }).Where(z => z.Count() == 4); 

       var match5 = 
         myList.AsEnumerable().GroupBy(
          record => 
          new { PRODUCT = record.Product, SHIPPINGTIME = record.ShippingTime }).Where(z => z.Count() == 5); 

       // Get the total from each of these group where they match, throw the rest out. 


       foreach (var entry in sublist) 
       { 
        Console.WriteLine(entry); 

       } 

       Assert.That(sublist, Is.Not.Null); 
      } 
     } 

// Поддерживающей Класс

public class MyClass 
    { 
     public int Id { get; set; } 
     public string Zone { get; set; } 
     public string Product { get; set; } 
     public string ShippingTime { get; set; } 
    } 
+0

Вы можете немного разобраться? Вы говорите: «создавать соответствующие группы, в которых зоны и продукты доступны в каждом матче», но в вашей группе групп группы 1 не совпадают. – aush

+0

Извините, но это не имеет смысла. Вам действительно нужно прояснить свой вопрос. Даже материал ниже «Результат должен быть» не имеет смысла. – sloth

+0

Да, как уже упоминалось ранее, зона и продукты будут меняться, но в группе 1 продукты будут одинаковыми. Продукты и тот факт, что и Zone EAST и South содержат их, указывают на совпадение. Надеюсь, это поможет. – user2284452

ответ

1

Я не уверен, что понял вас правильно, но я думаю, что вы хотите сделать что-то вроде этого:

myList.Select(record => record.Product) 
     .Distinct() 
     .Select(p => new 
       { 
        Product = p, 
        Zones = myList.Where(r => r.Product == p) 
           .Select(r => r.Zone) 
           .Distinct() 
       }) 
     .GroupBy(an => an.Zones.Count()) 

enter image description here

+0

Спасибо, человек, который прочитал весь вопрос. Это похоже на то, что я ищу. Позвольте мне отдать это. – user2284452

+0

aush - Большое спасибо! это заставило меня указать направление записи. – user2284452

Смежные вопросы