Created
April 2, 2012 10:19
-
-
Save timabell/2282389 to your computer and use it in GitHub Desktop.
hierarchy reader from stack overflow
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System.Collections.Generic; | |
namespace util | |
{ | |
/// <summary> | |
/// Storage and parsing of flat string based folder hierarchy. | |
/// See http://stackoverflow.com/a/8621711/10245 | |
/// </summary> | |
/// <example><code> | |
/// NodeEntryCollection cItems = new NodeEntryCollection(); | |
/// cItems.AddEntry(sLine, 0); | |
/// </code></example> | |
public class NodeEntryCollection : Dictionary<string, NodeEntry> | |
{ | |
public NodeEntryCollection() | |
{ | |
Separator = "/"; // default separator | |
} | |
/// <summary> | |
/// Gets or sets the separator used to split the hierarchy. | |
/// </summary> | |
/// <value> | |
/// The separator. | |
/// </value> | |
public string Separator { get; set; } | |
public void AddEntry(string entry) | |
{ | |
AddEntry(entry, 0); | |
} | |
/// <summary> | |
/// Parses and adds the entry to the hierarchy, creating any parent entries as required. | |
/// </summary> | |
/// <param name="entry">The entry.</param> | |
/// <param name="startIndex">The start index.</param> | |
public void AddEntry(string entry, int startIndex) | |
{ | |
if (startIndex >= entry.Length) | |
{ | |
return; | |
} | |
var endIndex = entry.IndexOf(Separator, startIndex); | |
if (endIndex == -1) | |
{ | |
endIndex = entry.Length; | |
} | |
var key = entry.Substring(startIndex, endIndex - startIndex); | |
if (string.IsNullOrEmpty(key)) | |
{ | |
return; | |
} | |
NodeEntry item; | |
if (ContainsKey(key)) | |
{ | |
item = this[key]; | |
} | |
else | |
{ | |
item = new NodeEntry { Key = key }; | |
Add(key, item); | |
} | |
// Now add the rest to the new item's children | |
item.Children.AddEntry(entry, endIndex + 1); | |
} | |
} | |
public class NodeEntry | |
{ | |
public string Key { get; set; } | |
public NodeEntryCollection Children { get; set; } | |
public NodeEntry() | |
{ | |
Children = new NodeEntryCollection(); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment