2015-08-26 2 views
1

У меня есть два пользовательских списка. Один список называется detailList, а другой hldList. Ниже приведен упрощенный вариант.Разделить пользовательский список на основе значений в другом списке

class Details 
{ 
    string Fund 
    string DT 
} 

class Holding 
{ 
    string Fund 
    string Name 
    double Price 
    double Amount 
} 

То, что я хочу сделать, это разделить hldList. Все средства в hldList есть в detailList. Я хотел бы разделить hldList на основе значения DT в detailList, на простом примере ниже,

detailList 
Fund  DT 
LMON  E 
LMPN  K 
PLLM  E 

Я только заселить Fund свойство в hldList для этого примера, но другие свойства будут заполнены.

hldList 
Fund 
LMON 
LMON 
LMON 
LMPN 
LMPN 
PLLM 
PLLM 

Так что я хотел бы, чтобы это было разделить на DT собственность detailList поэтому ответ должен быть,

E List   K List 
LMON   LMPN 
LMON   LMPN 
LMON 
PLLM 
PLLM 

Я беру это лучший способ для достижения этой цели является использование LINQ? Однако не знаете, как это сделать?

ответ

4

Вы можете использовать GroupBy, чтобы сгруппироваться по этому объекту. Вам просто нужно связать оба списка с Join:

var dtGroups = from h in hldList 
       join d in detailList 
       on h.Fund equals d.Fund 
       group h by d.DT into dtGroup 
       select dtGroup; 

foreach (var grp in dtGroups) 
    Console.WriteLine("Key:{0} Funds:{1}" 
     , grp.Key, string.Join(",", grp.Select(h => h.Fund))); 

Если вы хотите List<Holding> для каждого DT-группы:

IEnumerable<List<Holding>> dtHoldingLists = 
       from h in hldList 
       join d in detailList 
       on h.Fund equals d.Fund 
       group h by d.DT into dtGroup 
       select dtGroup.ToList(); 
+0

Код, указанный выше работает. Я в основном разбиваю свой список на две группы. Затем каждый список передается методу, который ожидает, что параметр будет иметь тип List . Как я могу выбрать список на основе его ключевого значения? – mHelpMe

+1

@mHelpMe: Я отредактировал свой ответ. –

+0

Спасибо за обновление. Скажем, d.DT принимает два значения: «A» и «B» есть в любом случае, чтобы указать, какой список принадлежит A или B. Итак, если фонды в hldList - это A, они должны быть отправлены методу A и если средства B они должны быть отправлены методу B. Поэтому нужно знать, какой список есть, что это имеет смысл? – mHelpMe

1

Прежде всего присоединиться как списки, как

var result = (from b in hldList 
       join a in detailList on b.Fund equals a.Fund 
       select new { a.DT, a.Fund, b.(*Other Columns)}).OrderBy(a=>a.DT).ToList(); 

затем группировать

var nList = result.GroupBy(a => a.DT).ToList(); 

И, наконец, вы можете прокручивать каждый элемент разделенного списка

foreach (var it in nList) 
{ 
    //Here you can process each list one by one 
    nList.Where(i => i.Key == it.Key).ToList(); 
} 
Смежные вопросы