remove additional enumerations in get recursive children

This commit is contained in:
Luke Pulverenti 2013-09-26 14:45:43 -04:00
parent b8c4056522
commit 2d0cc66e6b

View File

@ -977,18 +977,24 @@ namespace MediaBrowser.Controller.Entities
return result; return result;
} }
return GetChildrenList(user, includeLinkedChildren); var initialCount = _children.Count;
var list = new List<BaseItem>(initialCount);
AddChildrenToList(user, includeLinkedChildren, list, false);
return list;
} }
/// <summary> /// <summary>
/// Gets the children list. /// Adds the children to list.
/// </summary> /// </summary>
/// <param name="user">The user.</param> /// <param name="user">The user.</param>
/// <param name="includeLinkedChildren">if set to <c>true</c> [include linked children].</param> /// <param name="includeLinkedChildren">if set to <c>true</c> [include linked children].</param>
/// <returns>List{BaseItem}.</returns> /// <param name="list">The list.</param>
private List<BaseItem> GetChildrenList(User user, bool includeLinkedChildren) /// <param name="recursive">if set to <c>true</c> [recursive].</param>
private bool AddChildrenToList(User user, bool includeLinkedChildren, List<BaseItem> list, bool recursive)
{ {
var list = new List<BaseItem>(); var hasLinkedChildren = false;
foreach (var child in Children) foreach (var child in Children)
{ {
@ -996,12 +1002,27 @@ namespace MediaBrowser.Controller.Entities
{ {
list.Add(child); list.Add(child);
} }
if (recursive)
{
var folder = child as Folder;
if (folder != null)
{
if (folder.AddChildrenToList(user, includeLinkedChildren, list, true))
{
hasLinkedChildren = true;
}
}
}
} }
if (includeLinkedChildren) if (includeLinkedChildren)
{ {
foreach (var child in GetLinkedChildren()) foreach (var child in GetLinkedChildren())
{ {
hasLinkedChildren = true;
if (child.IsVisible(user)) if (child.IsVisible(user))
{ {
list.Add(child); list.Add(child);
@ -1009,9 +1030,10 @@ namespace MediaBrowser.Controller.Entities
} }
} }
return list; return hasLinkedChildren;
} }
private int _lastRecursiveCount;
/// <summary> /// <summary>
/// Gets allowed recursive children of an item /// Gets allowed recursive children of an item
/// </summary> /// </summary>
@ -1026,12 +1048,14 @@ namespace MediaBrowser.Controller.Entities
throw new ArgumentNullException(); throw new ArgumentNullException();
} }
var initialCount = _children.Count; var initialCount = _lastRecursiveCount == 0 ? _children.Count : _lastRecursiveCount;
var list = new List<BaseItem>(initialCount); var list = new List<BaseItem>(initialCount);
AddRecursiveChildrenInternal(user, includeLinkedChildren, list); var hasLinkedChildren = AddChildrenToList(user, includeLinkedChildren, list, true);
if (includeLinkedChildren) _lastRecursiveCount = list.Count;
if (includeLinkedChildren && hasLinkedChildren)
{ {
list = list.Distinct().ToList(); list = list.Distinct().ToList();
} }
@ -1039,27 +1063,6 @@ namespace MediaBrowser.Controller.Entities
return list; return list;
} }
/// <summary>
/// Adds the recursive children internal.
/// </summary>
/// <param name="user">The user.</param>
/// <param name="includeLinkedChildren">if set to <c>true</c> [include linked children].</param>
/// <param name="list">The list.</param>
private void AddRecursiveChildrenInternal(User user, bool includeLinkedChildren, List<BaseItem> list)
{
foreach (var item in GetChildrenList(user, includeLinkedChildren))
{
list.Add(item);
var subFolder = item as Folder;
if (subFolder != null)
{
subFolder.AddRecursiveChildrenInternal(user, includeLinkedChildren, list);
}
}
}
/// <summary> /// <summary>
/// Gets the linked children. /// Gets the linked children.
/// </summary> /// </summary>