#c# #list #sorting #google-chrome #bookmarks
#c# #Список #сортировка #google-chrome #закладки
Вопрос:
Я пытаюсь отсортировать закладки Chromes в алфавитном порядке сначала по папкам, а затем по URL-адресам
У меня есть эти классы (автор: г-н Джейсон Гримм)
public class Bookmarks
{
public string Checksum { get; set; }
public Root Roots { get; set; }
public int Version { get; set; }
}
/// <summary>
/// Contains 'folders' such as 'Bookmarks bar' and 'Other bookmarks'
/// </summary>
public class Root
{
public RootItem Bookmark_bar { get; set; }
public RootItem Other { get; set; }
}
/// <summary>
/// A folder of bookmarks
/// </summary>
public class RootItem
{
public List<Child> Children { get; set; }
public string Date_added { get; set; }
public string Date_modified { get; set; }
public int Id { get; set; }
public String Name { get; set; }
public string Type { get; set; }
}
/// <summary>
/// Contains information about a specific bookmark
/// </summary>
public class Child
{
public List<Child> Children { get; set; }
public string date_added { get; set; }
public int ID { get; set; }
public string Name { get; set; }
public String Type { get; set; }
public Uri Url { get; set; }
}
Я использую JavaScriptSerializer для десериализации и сериализации файла JSON.
Файл десериализуется нормально в структуру класса Bookmarks.
Теперь я хочу отсортировать корневой элемент двух списков.Дочерние элементы и дочерние элементы.Дочерние элементы, чтобы сначала шли все папки, а затем URL-адреса в алфавитном порядке.
Как бы мне это сделать?
Ответ №1:
Используйте List.Sort(Comparison<T> comparison)
с пользовательским сравнением.
Это непроверенный код, поскольку у меня нет вашей десериализованной структуры, возможно, вам потребуется дополнить его некоторой обработкой null, если Child.ChildItem
может быть null .
Я также предполагаю, что дочерний элемент.Тип указывает, является ли закладка папкой или URL-адресом. Если нет, просто измените comparisson return child1.Type.CompareTo(child2.Type);
на что-то, что сортирует по папке / url.
public void SortChildren(List<Child> childList)
{
childList.Sort((child1, child2) =>
{
if (child1.Type == child2.Type)
{
// Sort by name
return child1.Name.CompareTo(child2.Name);
}
else
{
// Sort the type. If this sorts in reverse, swap child1 and child2
return child1.Type.CompareTo(child2.Type);
}
});
// Sort children recursively
foreach(var child in childList)
{
SortChildren(child.Children);
}
}
Начните сортировку с
SortChildren(Root.Other.Children);
Редактировать
Более простой пример сортировки списка
List<int> myInts = new List<int>{1,5,4,3,2};
myInts.Sort(); // default comparer
myInts.Sort((i1, i2) => { return i2.CompareTo(i1); }); // custom "reverse" comparison
Комментарии:
1. Хорошо, вам нужно объяснить немного больше… Куда я должен поместить функцию sortChildren? И поскольку он ничего не возвращает, я предполагаю, что исходный список будет отсортирован?
2. Вы можете поместить sortChildren в любой класс, который вам нравится. Да, он будет сортировать исходные списки. Проверьте ссылку на документацию вверху.
3. Есть ли какая-то конкретная часть, которую трудно понять?
4. Сейчас я чувствую себя очень глупо… Насколько я понимаю, в примере на MSDN вы создаете класс IComparer, который имеет метод Compare, который выполняет сравнение. Затем вы вызываете List.Sort() с помощью этого средства сравнения. Для меня это имеет смысл, но я не понимаю, куда вписывается ваш метод sortChildren? Я хотел бы иметь объект Bookmarks и вызывать myBookmarks. Sort(); и отсортируйте весь список <Дочерний элемент>…
5. Существует два способа создания пользовательской сортировки. 1) Реализовать IComparer, в данном случае on
Child
. 2) Создайте метод, который принимает два параметра типа, который вы хотите отсортировать, и возвращает значение int . Я не выполнил 2 и реализовал метод как лямбда-выражение вместо явного метода.
Ответ №2:
Если вы хотите, чтобы все они были в одном списке, вам нужно создать объект с нужными вам свойствами, например, MyListItem .
Я думаю, что ссылаться, System.Linq;
а затем вы можете сделать это select Children.Select(c => new MyListItem( Name = c.Name, etc )
.
Затем вы можете сделать то же самое для URL-адресов, но добавить .OrderBy(c => c.Url);
Наконец, вы можете добавить последний список к первому, используя ToList()
и Append
.