2013-12-16 2 views
0

Пожалуйста, см грубого фрагмента кода, что required.class А внешний класс, который имеет три внутренние списки типа B.LINQ создать новый список из элементов внешнего и внутреннего списка

public class A 
{ 
    public List<B> var1; 
    public List<B> var2; 
    public List<B> var3; 
    int x; 
    int y; 
} 

public class B 
{ 
    public string strA; 
    public string strB; 
    public string strC; 
} 

// This is the new class which i want as output  
public class C 
{ 
    public string strC1; 
    public string strC2; 
    public string strC3; 
    public int x; 
    public int y; 
    public bool direction; 
} 

List<A> ListA = SomeClass.GetData(); 
List<B> ListB= new List<B>(); 
List<C> ListC = new List<C>(); 

foreach(A myA in ListA) 
{ 
    ListB = myA.var1; 
    foreach(B mydata1 in ListB) 
    { 
    C var = new C(); 
    var.strC1 = mydata1.strA; 
    var.strC2 = mydata1.strB; 
    var.strC3 = mydata1.strC; 
    var.x = myA.x; 
    var.y = myA.y; 
    var.direction = true; //if input it is true 
    ListC.Add(var); 

    } 

    ListB = myA.var2; 
    foreach(B mydata1 in ListB) 
    { 
    C var = new C(); 
    var.strC1 = mydata1.strA; 
    var.strC2 = mydata1.strB; 
    var.strC3 = mydata1.strC; 
    var.x = myA.x; 
    var.y = myA.y; 
    var.direction = true; //if input it is true 
    ListC.Add(var); 

    } 

    ListC = myA.var3; 
    foreach(B mydata1 in ListB) 
    { 
    C var = new C(); 
    var.strC1 = mydata1.strA; 
    var.strC2 = mydata1.strB; 
    var.strC3 = mydata1.strC; 
    var.x = myA.x; 
    var.y = myA.y; 
    var.direction = false; //if input it is true 
    ListC.Add(var); 

    } 
} 

var grpList = ListC.GroupBy(p => p.strC); 

Мой выход является ListC который состоит из элементов внутреннего класса B и внешнего класса A, а конечный вывод сгруппирован.

+0

Вы можете указать свой рабочий код? – Grundy

+1

Действительно ли вам нужно 'var' как имя объекта? –

+0

Его просто как алгоритм того, что требуется. Как я уже упоминал, это всего лишь примерный фрагмент кода – user3106666

ответ

0

Отредактированный ответ: для сплющенный целевого класса C

public class C 
{ 
    public string strC1; 
    public string strC2; 
    public string strC3; 
    public int x; 
    public int y; 
    public bool direction; 
} 

Просто использовать SelectMany уплощение метод и накидные несколько раз ...

var C1 = A1.SelectMany(p => p.var1, (p,q) => new C(){ 
    strC1 = q.strA, 
    strC2 = q.strB, 
    strC3 = q.strC, 
    x = p.x, 
    y = p.y, 
    direction = true 
    } 
).Union(
    A1.SelectMany(p => p.var2, (p,q) => new C(){ 
    strC1 = q.strA, 
    strC2 = q.strB, 
    strC3 = q.strC, 
    x = p.x, 
    y = p.y, 
    direction = true 
    }) 
).Union(
    A1.SelectMany(p => p.var3, (p,q) => new C(){ 
    strC1 = q.strA, 
    strC2 = q.strB, 
    strC3 = q.strC, 
    x = p.x, 
    y = p.y, 
    direction = false 
    }) 
).ToList(); 

edit2: просто понял, что я повторил такой же функция 3 раз выше. Более лаконичный способ написания этого будет:

var fn1 = new Func<A, B, C>((p,q) => new C(){ 
    strC1 = q.strA, 
    strC2 = q.strB, 
    strC3 = q.strC, 
    x = p.x, 
    y = p.y, 
    direction = !p.var3.Contains(q) 
    }); 

var C1 = A1.SelectMany(p => p.var1, fn1 
).Union(
    A1.SelectMany(p => p.var2, fn1) 
).Union(
    A1.SelectMany(p => p.var3, fn1) 
).ToList(); 

Edit3 - направление теперь ложь в приведенном выше примере, когда приходят из списка var3

Heres статью, описывающую SelectMany немного больше ... http://dotnet.dzone.com/news/selectmany-probably-the-most-p

+0

Спасибо большое. Это именно то, что требовалось. – user3106666

+0

Спасибо также за ссылку, предоставленную на SelectMany. – user3106666

+0

Не беспокойтесь - также просто понял, что есть более сжатый способ написать это, не повторяя одну и ту же функцию 3 раза - как показано в приведенном выше правиле! –

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