私は以下のタイプのデータをより良い方法でソートする方法を模索しています。以下ここでは、このソートアルゴリズムにより、大きなデータセットを処理する際にスタックオーバーフローが発生しますか?
public class AttributeItem
{
public string AttributeType { get; set; }
public string Title { get; set; }
public string Value { get; set; }
public int ObjectID { get; set; }
public bool CanModify { get; set; }
public bool CanDelete { get; set; }
public bool? IsParent { get; set; }
public int SortID { get; set; }
public int? ParentSortID { get; set; }
public bool Deleted { get; set; }
}
public class AttributeItemNode
{
public AttributeItem Item {get;set;}
public int Depth {get;set;}
public AttributeItemNode(AttributeItem item , int Depth)
{
this.Item = item ;
this.Depth = Depth;
}
}
のように見えているデータを保持しているその場所での構造(一部のシステムで他の9000の2000年)より小さなデータセットのために正常に動作しますが、大きいものを処理するときにStackOverflowが発生し
深度を示すintを持つ単一のオブジェクトにソートする必要があるデータの例です。子どもたちのレベルは次のように予想される出力は次のようになり、データ例に示される3つのレベル
var items = new List<AttributeItem>();
items.Add(new AttributeItem{Title ="Parent1", ObjectID=1,SortID =1, IsParent= true, ParentSortID = Int32.MinValue});
items.Add(new AttributeItem{Title ="FooChild", ObjectID=2,SortID =2, IsParent= false, ParentSortID = 1});
items.Add(new AttributeItem{Title ="Parent2", ObjectID=4,SortID =4, IsParent= true, ParentSortID = Int32.MinValue});
items.Add(new AttributeItem{ Title ="Parent2Child1", ObjectID=5,SortID =5, IsParent= false, ParentSortID = 4});
items.Add(new AttributeItem{Title ="Parent2Child2", ObjectID=7,SortID =7, IsParent= false, ParentSortID = 4});
items.Add(new AttributeItem{Title ="Parent2Child2Child1", ObjectID=6,SortID =6, IsParent= false, ParentSortID = 5});
より深く行くことが(私は読みやすさを支援するために、オブジェクトから無関係なデータを削除した)
可能ですここでDepth = 0 Title ="Parent1"
Depth = 1 Title ="FooChild"
Depth = 0 Title ="Parent2"
Depth = 1 Title ="Parent2Child1"
Depth = 2 Title ="Parent2Child2Child1"
Depth = 1 Title ="Parent2Child2"
は、実際のソートコード
public static IList<AttributeItemNode> SortAttributeItems(IList<AttributeItem> list)
{
List<AttributeItemNode> newList = new List<AttributeItemNode>();
SortAttributeItems(list, null, 0, newList);
return newList;
}
private static void SortAttributeItems(IList<AttributeItem> list, AttributeItem currentItem, int depth, List<AttributeItemNode> newList)
{
AttributeItem newItem = null;
// look for children
if (currentItem != null)
{
foreach (AttributeItem item in list)
{
if (item.ParentSortID.HasValue && item.ParentSortID.Value != Int32.MinValue && item.ParentSortID.Value == currentItem.SortID)
{
newList.Add(new AttributeItemNode(item, (depth + 1)));
SortAttributeItems(list, item, depth + 1, newList);
}
}
}
if (depth == 0)
{
foreach (AttributeItem item in list)
{
if (!item.ParentSortID.HasValue || item.ParentSortID.Value == Int32.MinValue)
{
if (currentItem == null || item.SortID >= currentItem.SortID)
{
if (newItem == null || newItem.SortID >= item.SortID)
{
newItem = item;
}
}
}
}
}
if (newItem != null)
{
newList.Add(new AttributeItemNode(newItem, depth));
list.Remove(newItem);
SortAttributeItems(list, newItem, depth, newList);
}
}
私はあなたのポイントを見ますが、質問で述べたように。それは大量のデータで失敗します。最適化を探しているだけです。大きなデータセットで実際に遅い場合は、私は同意します。 –
タイトルを編集して、*改善*以外のものを求めてください。*はより効果的なものを作ることを意味します*と、最初の段落は*よりうまくいくと尋ねます。それを改善*。 –
ありがとうございます。私の議決は取り下げられました。 :-) –