C 將扁平狀資料鏈結成樹狀結構的通用方法

2022-03-11 08:53:04 字數 2864 閱讀 1551

在專案中經常會遇到從資料庫查詢資料繫結到treeview上,這時我們需要將查詢出來的資料轉換成樹形結構資料,每次寫覺得工作會很重複,所以寫了乙個通用的轉換類。

第一步,我們需要建乙個基類,這個基類的意義主要是擴充套件資料庫實體類做連線用,用於確定樹形結構中節點與子項的關係,

其中parent為當前節點的父節點,children為當前節點的子節點,islinked是判斷當前節點是否已連線,用於防止資料中有迴圈依賴導致建立樹的時候形成死迴圈。

treemodel基類

public

class treebase

set

}//////

父節點

/// public t parent

//////

子節點

/// public observablecollectionchildren

}

第二步,我們需要建立乙個連線方法,將輸入的扁平狀資料轉換為樹狀結構,我希望在使用的時候可以自己指定實體的哪個屬性為id,哪個為父id

,這裡我們使用了expression,這樣就可以使用linq表示式去指定屬性了,剩下的就是利用反射獲取實體的值與遞迴連線了,這樣乙個簡單的通用建立樹的方法就有了。

public

class

treehelper

);foreach (var leaf in

root.children)

}//////

建立多個根節點的樹

/// ///

實體型別

///根節點 ///

所有資料

///節點唯一標識屬性表示式

///父節點屬性表示式

public

static observablecollectioncreatetree(ilistlist, expressionobject>> idproperty, expressionobject>> parentidproperty) where t : treebase

return

roots;

}private

static

object getpropertyvalue(t t, string

propertyname)

private

static

string getmembername(expression>propertyselector)

return

propertyexp.member.name;

}}

使用示例:

先宣告乙個繫結實體,繼承自treebase

public

class item : treebase

public string parentid

public string displaytext

}

建立測試資料

ilistdata = new list();

var group1= new item();

var item1 = new item ;

var item2 = new item ;

var item3 = new item ;

var item4 = new item() ;

var item5 = new item() ;

var item6 = new item() ;

data.add(group1);

data.add(item1);

data.add(item2);

data.add(item3);

data.add(item4);

data.add(item5);

data.add(item6);

介面模板繫結

<

treeview

height

="245"

horizontalalignment

="left"

margin

="46,35,0,0"

name

="treeview1"

verticalalignment

="top"

width

="156"

>

<

treeview.itemtemplate

>

<

hierarchicaldatatemplate

itemssource=""

>

<

textblock

text=""

>

textblock

>

hierarchicaldatatemplate

>

treeview.itemtemplate

>

treeview

>

後台資料繫結

treeview1.itemssource = treehelper.createtree(data, item => item.id, item => item.parentid);

以後繫結樹形資料是不是很簡單呢?

這種方法不適應主鍵為guid的資料型別

因為以下**無法獲取guid型別的名稱,歡迎各位大叔,大嬸,大神們指點

private

static

string getmembername(expression>propertyselector)

return

propertyexp.member.name;

}

將扁平資料轉成樹狀資料

將扁平資料轉成樹狀資料,轉化中間可以新增自己想要的字段 序號等等 export const flattranstree ids,list else brancharr.length 0?father.children brancharr return father.pid 0 return newa...

資料鏈的建立和資料鏈的輸出

本次程式主要實現資料鏈的儲存和輸出,並把輸出的數值寫在乙個檔案中 本程式的主要 是在定義 lnode p l next 定義乙個結點指標p指向頭結點的下乙個結點 還有資料鏈建立之後,資料鏈上得指標不能返回,只有利用創立的方法中呼叫修改資料鏈的方法 再寫方法 方法中套方法 include includ...

資料鏈路協議

鏈路就是一條無源的從點到點的物理線路段,中間沒有任何其他的交換節點。在進行通訊時,兩台計算機的通訊通路是由多條鏈路串接而成的。當需要在一條鏈路上通訊時,除了需要物理鏈路,還需要一些規程來控制這些資料的傳輸,把實現這些規程的硬體和軟體加到鏈路上,就構成了資料鏈路 差錯控制自動請求重發又可以稱為後向糾錯...