5

初めて聞く話LINQで、よくわかりません。私に優しくしてください。

私はこのデータセットを持っています。

+---------+--------+---------------+
| 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 |               |
+---------+--------+---------------+

私がする必要があるのは、のリストを返すメソッドを書くことですNodeID。例、

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

期待される結果は NodeIDs:2 and 11です。

NodeID = 2に属する にRadioID = R7接続されている があるため、含まれています。RadioID = R0NodeID = 1

NodeID = 11RadioID = R11はに接続されているため、 も含まれます(Radio = R9にも接続されています)。NodeID = 2NodeID = 1

私はこの記事を調べますが、いつも取得しますStackOverFlowException

完全なコードは次のとおりです。

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;
    }

}

それを行うためのはるかに良い方法があるかどうかを提案できます。申し訳ありません初心者です。

4

1 に答える 1

2

あなたが初心者なら、再帰とラムダを賢く使いすぎないでください。

    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();
    }

更新 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();
}
于 2013-05-01T03:22:55.003 に答える