2013-05-01 7 views
5

Dies ist mein erstes Mal zu hören über LINQ und ich habe keine Ahnung davon. Bitte sei sanft zu mir.Holen Sie sich einen Kinder-Rekord mit Linq

Ich habe diesen Datensatz.

+---------+--------+---------------+ 
| RadioID | NodeID | SourceRadioID | 
+---------+--------+---------------+ 
| R0  |  1 |    | 
| R1  |  1 |    | 
| R2  |  1 |    | 
| R3  |  1 |    | 
| R4  |  1 |    | 
| R5  |  2 |    | 
| R6  |  2 |    | 
| R7  |  2 | R0   | 
| R8  |  2 |    | 
| R9  |  2 |    | 
| R10  |  11 |    | 
| R11  |  11 | R9   | 
| R12  |  11 |    | 
| R13  |  11 |    | 
+---------+--------+---------------+ 

Was ich tun muss, ist es, ein Verfahren zu schreiben, die eine Liste von NodeID zurückgibt. Beispiel:

List<int> dependentNode = GetChildNode(1); // int ParentNode 

Meine erwarteten Ergebnisse sind NodeIDs: 2 and 11.

NodeID = 2 ist enthalten, da es eine RadioID = R7 gibt, die mit RadioID = R0 verbunden ist, die zu NodeID = 1 gehört.

NodeID = 11 ist ebenfalls enthalten, weil RadioID = R11 zu Radio = R9 verbunden ist, die zu NodeID = 2 gehört (die auch NodeID = 1 verbunden ist).

ich diesen Artikel nachschlagen, aber ich bekomme immer StackOverFlowException

Hier ist der vollständige Code:

public class RadioEntity 
{ 
    public string RadioID { get; set; } 
    public int NodeID { get; set; } 
    public string SourceRadioID { get; set; } 
} 

public class SampleDemo 
{ 
    public void SampleMethod() 
    { 

     Func<int, int,List<int>> GetChildNode = null; 
     GetChildNode = (x, y) => 
      { 
       return (from _x in GetRadio() 
         where (GetRadio().Where(i => i.NodeID == x).Select(i => i.RadioID)).Contains(_x.RadioID) 
         from _y in new[] { _x.NodeID }.Union(GetChildNode(_x.NodeID, y + 1)) 
         select _y).ToList<int>(); 
      }; 

     var _res = GetChildNode(1, 0); 

    } 

    public List<RadioEntity> GetRadio() 
    { 
     List<RadioEntity> _returnVal = new List<RadioEntity>(); 
     _returnVal.Add(new RadioEntity() { RadioID = "R0", NodeID = 1, SourceRadioID = "" }); 
     _returnVal.Add(new RadioEntity() { RadioID = "R1", NodeID = 1, SourceRadioID = "" }); 
     _returnVal.Add(new RadioEntity() { RadioID = "R2", NodeID = 1, SourceRadioID = "" }); 
     _returnVal.Add(new RadioEntity() { RadioID = "R3", NodeID = 1, SourceRadioID = "" }); 
     _returnVal.Add(new RadioEntity() { RadioID = "R4", NodeID = 1, SourceRadioID = "" }); 
     _returnVal.Add(new RadioEntity() { RadioID = "R5", NodeID = 2, SourceRadioID = "" }); 
     _returnVal.Add(new RadioEntity() { RadioID = "R6", NodeID = 2, SourceRadioID = "" }); 
     _returnVal.Add(new RadioEntity() { RadioID = "R7", NodeID = 2, SourceRadioID = "R0" }); 
     _returnVal.Add(new RadioEntity() { RadioID = "R8", NodeID = 2, SourceRadioID = "" }); 
     _returnVal.Add(new RadioEntity() { RadioID = "R9", NodeID = 2, SourceRadioID = "" }); 
     _returnVal.Add(new RadioEntity() { RadioID = "R10", NodeID = 11, SourceRadioID = "" }); 
     _returnVal.Add(new RadioEntity() { RadioID = "R11", NodeID = 11, SourceRadioID = "R9" }); 
     _returnVal.Add(new RadioEntity() { RadioID = "R12", NodeID = 11, SourceRadioID = "" }); 
     _returnVal.Add(new RadioEntity() { RadioID = "R13", NodeID = 11, SourceRadioID = "" }); 

     return _returnVal; 
    } 

} 

Sie können vorschlagen, wenn es viel besseren Weg, es zu tun . Entschuldigung Neuling hier.

Antwort

2

Wenn Sie Anfänger sind dont be zu klug mit Rekursion und Lambda-Ausdrücke.

public List<int> GetChildren(int id) 
    { 
     var nodes = GetRadio(); 
     var parent = nodes.Single(n => n.NodeID == id); 
     var children = nodes.Where(n => n.SourceRadioID == parent.RadioID).Select(n => n.NodeID); 

     return children.Union(children.SelectMany(GetChildren)).ToList(); 
    } 

UPDATE 1

public List<int> GetChildren(int id) 
{ 
    IEnumerable<RadioEntity> parent = GetRadio().Where(x => x.NodeID == id); 
    IEnumerable<int> children = (
            from r in GetRadio() 
            where parent.Select(x=>x.RadioID) 
               .Contains(r.SourceRadioID) 
            select r 
           ).Select(n => n.NodeID); 

    return children.Union(children.SelectMany(GetChildren)).ToList(); 
} 
+0

wie ist das die Kinder Kinder bekommen? –

+0

Wie wird dieser Kerl für das größere Gut abstimmen? –

+1

einfach entspannen, downvotes sind keine persönlichen Angriff, sie bedeuten nichts anderes als die Antwort gegeben ist nicht korrekt und beantwortet die Frage nicht. –

Verwandte Themen