Reputation: 45
I have a entity as follow:
public class MarketDataBEO
{
public MarketDataBEO()
{
childDetails = new List<MarketDataBEO>();
}
public string MarketID { get; set; }
public string MarketHeirarchyID { get; set; }
public string MarketName { get; set; }
public string TotalMarketSizeCYM1GI { get; set; }
public List<MarketDataBEO> childDetails { get; set; }
}
the relation is between MarketID and MarketHeirarchyID
a child can also have another child list
how do i create a multilevel list ?
EDIT:
MarketID | MarketHeirarchyID
1 NULL
2 NULL
3 2
4 2
5 8 <--
6 5
7 NULL
8 7
9 7
10 8
Upvotes: 3
Views: 183
Reputation: 117345
var dict = dt.AsEnumerable()
.ToDictionary(
row => row[0].ToString(),
row => {
return new MarketDataBEO()
{
MarketID = row[0].ToString(),
MarketHeirarchyID = row[1].ToString()
// Other class members here
// MarketName = row[2].ToString()
// TotalMarketSizeCYM1GI = row[3].ToString()
}
);
foreach (var m in dict.Values)
{
if (!string.IsNullOrEmpty(m.MarketHeirarchyID))
dict[m.MarketHeirarchyID].childDetails.Add(dict[m.MarketID]);
}
var result = dict.Values.ToList();
Upvotes: 1
Reputation: 32541
Try this:
var marketDataBEO = new MarketDataBEO() { MarketID = "0" };
var dictionary = new Dictionary<string, MarketDataBEO>();
dt.Rows
.Cast<DataRow>()
.OrderBy(dr => Convert.ToInt32(dr["MarketID"].ToString()))
.ToList().ForEach(dr =>
{
var m = new MarketDataBEO()
{
MarketID = dr["MarketID"].ToString(),
MarketHeirarchyID = dr["MarketHeirarchyID"].ToString()
};
if (dr["MarketHeirarchyID"].ToString() == "")
{
marketDataBEO.childDetails.Add(m);
}
else
{
dictionary[dr["MarketHeirarchyID"].ToString()].childDetails.Add(m);
}
dictionary.Add(m.MarketID, m);
});
[EDIT] Based on your updated info, here's a 2-step approach. First, you'd get all the rows inside a dictionary, then you'd parse the KeyValuePair
collection and create your hierarchical object.
var marketDataBEO = new MarketDataBEO() { MarketID = "0" };
var dictionary = new Dictionary<string, MarketDataBEO>();
dt.Rows.Cast<DataRow>()
.ToList().ForEach(dr =>
{
var m = new MarketDataBEO()
{
MarketID = dr["MarketID"].ToString(),
MarketHeirarchyID = dr["MarketHeirarchyID"].ToString()
};
dictionary.Add(m.MarketID, m);
});
dictionary.ToList().ForEach(kvp =>
{
if (kvp.Value.MarketHeirarchyID == "")
{
marketDataBEO.childDetails.Add(kvp.Value);
}
else
{
dictionary[kvp.Value.MarketHeirarchyID].childDetails.Add(kvp.Value);
}
});
Upvotes: 0
Reputation: 21487
Pseudo-code:
foreach(var x in datatable.Select(d=>d.MarketHerarchyId!="").ToList())
{
datatable.Find(x.MarketHeirarchyId).childDetails.Add(x);
datatable.Remove(x);
}
Upvotes: 0