Выборочная сортировка в .NET - PullRequest
1 голос
/ 31 июля 2010

Я разработал класс для родительских и дочерних отношений

  class Category
  {
    public string CatName;
    public string CatId;
    public IList<Category> childCategory = new List<Category>();

    public  void addChildCat(Category childCat)
    {
      this.childCategory.Add(childCat);
    }

    public Category SortedCategory(Category cat)
    {
      // Should return the sorted cat i.e topmost parent        
    }
}

Здесь у Parent не будет Catname или CatId, у него будут дочерние категории с CatName, CatId, а также другой список дочерних категорий, и онидет до "N" категорий

  1. Здесь мне нужно получить Top Parent со всеми дочерними категориями, отсортированными по CatName.Любые идеи Как этого достичь?
  2. ХОРОШО ли дизайн моего класса?

Ответы [ 4 ]

1 голос
/ 31 июля 2010

Вы не можете, потому что у вас нет ссылки на родителя. Вы должны добавить поле:

public Category Parent { get; set; }

и измените метод add для установки родителя:

public void addChildCat(Category childCat)
{
  childCat.Parent = this;
  this.childCategory.Add(childCat);
}

Вам нужен родитель, чтобы получить рут:

public static Category SortedCategory(Category cat)
{
  // get the root
  var root = cat;
  while(root.Parent != null) root = root.Parent;

  return root.GetSorted();
}

private Category GetSorted()
{
  var sortedChildren = new List<Category>(childCategories).ConvertAll(c => c.GetSorted());
  sortedChildren.Sort((c1, c2) => c1.CatName.CompareTo(c2.Catname));

  return new Category { CatName = root.CatName, 
                        Catid = root.CatId,
                        childCategories = sortedChildren; }
}
1 голос
/ 31 июля 2010

Вы можете использовать SortedList для отслеживания дочерних категорий.

0 голосов
/ 30 ноября 2010

Вместо:

public string CatName;
public string CatId;

Я бы сделал:

 class Cat
 {
      public string Name { get; set; }
      public string Id { get; set; }
 }

И вместо:

public Category SortedCategory(Category cat)
    {
      // Should return the sorted cat i.e topmost parent        
    }

Я бы сделал:

 var category = new List<Cat>
                               {
                                   new Cat() {Name = "cat1", Id = "123"},
                                   new Cat() {Name = "cat2", Id = "124"},
                                   new Cat() {Name = "cat3", Id = "125"},
                                   new Cat() {Name = "cat4", Id = "126"}
                               };


category.Sort(( cat1, cat2) =>  ((Convert.ToInt32(cat1.Id) > Convert.ToInt32(cat2.Id)) ? 1 : 0) );
0 голосов
/ 31 июля 2010

Если я понимаю, у нас есть древовидная структура, верно?И какой результат вы ожидаете, отсортированные потомки самого верхнего родителя (root)?

...