0

ツリービューにパスのリストを表示する WPF プロジェクトに取り組んでいます。propertyPaths (例: NetworkControl.AlternateIndexText.Value") パスには ID があります。

コンストラクター:

public MessageElement()
{
    Children = new List<MessageElement>();
    messageElements = new List<MessageElement>();
}

public MessageElement(int id, string name,   List<MessageElement> children)
{
    this.ID = id;
    this.Name = name;
    this.Children = children;
}

public MessageElement(int id, string path)
{
    this.ID = id;
    this.path = path;
}

ここでは、どのように解析を行っているかを示しています。

BuildTree メソッドに渡す IEnumerable propertyPath から子を作成しています。

public List<MessageElement> BuildTree(IEnumerable<string> propertyPath)
{
    return (
            from path in propertyPath     // Ex: NetworkControl.AlternateIndexText.Value"
            let splitPath = path.Split('.')
            group path by path.Split('.')[0] into pathElementGroup

            select new MessageElement(ID, path)
            {
              // ID = Id,
              Name = pathElementGroup.Key,             //name of each tree node
              Children = BuildTree(                  //create child from the propertyPath
                from propertyPathElement in pathElementGroup
                where propertyPathElement.Length > pathElementGroup.Key.Length + 1
                select propertyPathElement.Substring(pathElementGroup.Key.Length + 1))
            }).ToList();

    }               

データを入力します。

public List<MessageElement> GetRequestTreeNodes()
{
    messageElements.Add(new MessageElement(1, "NetworkControl.AlternateIndexText.Value"));
    messageElements.Add(new MessageElement(2, "NetworkControl.AddressData.DestinationID"));
    messageElements.Add(new MessageElement(2, "NetworkControl.AddressData.MessageOriginatorID.Value"));
}

ここでは、messageElements リストから BuildTree メソッドに渡すリストを準備しています。

String[]  propertyPath = messageElements.Select(I => Convert.ToString(I.path)).ToArray();            
// int[] idList = messageElements.Select(I => (I.id)).ToArray();
List<MessageElement> nodeList = BuildTree(propertyPath);
return nodeList;

ツリー ノードの作成に使用している propertyPath リストと Id の間の関連付けを作成するにはどうすればよいですか。たとえば、MessageElement(1, "NetworkControl.AlternateIndexText.Value"));

4

1 に答える 1

0

「なぜ ID はまだ 0 なのですか?」という質問に対する答えです。IDをどこにも設定していないということです。それはどのように他の値になりますか?

ID を設定する最良の機会は、おそらくMessageElementオブジェクトを作成する場所です。BuildTreeメソッドのselectステートメントでそれを行っています。

select new MessageElement
                  { ... }

new を選択していますがMessageElement、コンストラクターを使用して ID を渡したり、初期化ブロックで ID を設定したりしていません。パラメータとしてandMessageElementを取るコンストラクタを構築して使用する必要があります。idpath

select new MessageElement(theId, thePath)
                  { ... }

ID の値をどこで取得するかについては、よくわかりません。あなたのコードを理解するのに苦労しています。意味のある変数名を使用すると、コードが理解しやすくなります。たとえば、「s」と「g」の意味は何ですか? 意味は明らかだと主張する人もいるかもしれませんが、意味のある名前を使用するのに費用はかかりません。また、BuildTree メソッド全体は 1 つの return ステートメントですが、16 行にわたる 2 つの個別の LINQ 内包クエリが含まれています。このコードを書き直して論理的なステップを小さくすると、デバッグが少し簡単になるどころか、問題がより明白になるのではないかと思います。C# は非常に表現力の高い言語ですが、可能な限り少ない数のステートメントを実現するよりも、その表現力を使用して明確性を高める方が適切です。

于 2013-06-08T01:48:01.653 に答える