2016-05-12 4 views
0

у меня есть аа пользовательского типа, как следующее:получить все поля с таким же именем и типа C#

public class Parent 
{ 
    public int Id; 
    public List<Child1> C1; 
    public List<Child2> C2; 

} 

public class Child1 
{ 
    public int Id; 
} 

public class Child2 
{ 
    public int Id; 
    public Child3 C3; 
} 

public class Child3 
{ 
    public int Id; 
} 

У меня есть список родительского класса

List<Parent> parent = new List<Parent>(); 

Что является лучшим способом, чтобы получить все поля идентификатора «родителя» в списке?

Самый простой способ - использовать вложенный цикл foreach, но является ли их более чистым способом сделать это?

Я хочу Идентификаторы всех родительских объектов, а также идентификаторами их рекурсивных объектов ребенка в одном списке, как

List<int> AllIds 
+1

Можете ли вы перефразировать свой вопрос? Неясно, какова ваша цель. Вы хотите просто выбрать родительские идентификаторы или некоторые дочерние идентификаторы? – Marco

+0

Любой способ, которым вы разрезаете его, сводится к некоторому виду вложенного цикла, либо явно, с LINQ и т. Д. – AntiTcb

+3

_ «Самый простой способ - использовать вложенный цикл foreach, но является их более чистым способом» _ Если это самый простой способ для вас и ваших коллег, использовать его. Легко чист, если он работает. –

ответ

0

Если вы хотите Решение LinQ

List<Parent> parent = new List<Parent>(); 
var parentIds = parent. 
    Select(p => p 
     // take C2 ids and C3 ids foreach Parent 
     .C2.SelectMany(c2 => new List<string> { c2.Id, c2.C3.Id}) 
     // Add each C1 id foreach parent 
     .Union(p.C1.Select(c1 => c1.Id)) 
     // Add its own id 
     .Concat(new List<string> { p.id }) 
    ); 
-1

Получить все родительские идентификаторы:

List<Parent> parents = new List<Parent>(); 
// populate parent list 

int[] parentIds = parents.Select(s => s.Id).ToArray(); 
+3

Возможно, я ошибаюсь, но похоже, что OP хочет все идентификаторы детей. –

+0

@ s.m. Правильно, я только что видел редактирование –

+0

Что делать, если нам нужны идентификаторы Child1 и Child2 в том же списке? – Ross

2

Вы можете добавить AllIDs свойство Parent

public IEnumerable<int> AllIDs 
{ 
    get 
    { 
    yield return Id; 

    foreach(var child in C1) 
    { 
     yield return child.Id; 
    } 

    foreach(var child in C2) 
    { 
     yield return child.Id; 
     yield return child.C3.Id; 
    } 
    } 
} 

Теперь вы можете сделать SelectMany на parent переменной

var ids = parent.SelectMany(p => p.AllIDs).ToList(); 
1

Вы можете использовать SelectMany и Enumerable.Concat:

List<int> allIds = parent 
    .SelectMany(p => new[] { p.Id } // or Enumerable.Repeat(p.Id, 1) 
     .Concat(p.C1.Select(c => c.Id)) 
     .Concat(p.C2.Select(c => c.Id))) 
    .ToList(); 

Если вместо этого вы хотите знать идентификатор, был ли ребенок или родительский идентификатор, вы можете выбрать анонимный тип, который содержит тип и его родительский идентификатор, если он доступен:

var allIds = parent 
    .SelectMany(p => new[] { new { Type="Parent", p.Id, Parent = (int?)null } } 
     .Concat(p.C1.Select(c => new { Type = "Child1", c.Id, Parent = (int?)p.Id })) 
     .Concat(p.C2.Select(c => new { Type = "Child2", c.Id, Parent = (int?)p.Id }))) 
    .ToList(); 

foreach (var x in allIds) 
    Console.WriteLine("ID:{0} Type:{1} Parent-ID:{2}", x.Id, x.Type, x.Parent?.ToString() ?? "no parent"); 
Смежные вопросы