Сортировка ListBox в C # с несколькими полями - PullRequest
0 голосов
/ 26 июня 2018

Есть ли способ сортировки списка в одном поле, а затем в другом?

(я видел другие сообщения, но думаю, что это немного сложнее).Я мог сделать это далеко, но думал, что есть более быстрая сокращенная версия, о которой я просто не знал.

В основном это читает каталог для всех папок в нем в формате:

DATENAME

Я разбираю имя по дате.Мне нужно организовать их по названию, ТО по дате (второй фильтр - это то, что сбивает меня с толку).

Итак, папка из:

12012016TULLY
1202019LAVA
2202018LAVA
5162019CLOUD
5202020LAVA

будет выглядеть как

5162019CLOUD
2202018LAVA
1202019LAVA
5202020LAVA
12012016TULLY

Итак, вот что у меня есть:

class MyListBoxItem
{
    public string StudyBaseFolder { get; set; }
    public string StudyName { get; set; }
    public string UserLastName { get; set; }
    public string StudyDate { get; set; }
}

List<MyListBoxItem> studiesAndFolders = new List<MyListBoxItem>();

//later int he code i build a list of studyNames (which is a path and I pasre the path here too)
foreach (string sn in studyName)
{
    //get user name

    String lastName = getLastName(sn);
    String theDate = getDate(sn);

    //can I organize this based on the LAST NAME THEN THE DATE
    studiesAndFolders.Add(new MyListBoxItem { StudyBaseFolder = path, StudyName = sn, UserLastName = lastName, StudyDate = theDate }); 

 }

Затем я наконец добавляю это в список.

listDirectories.Items.Clear();

//I do it this way so a double click on an item gets the object back and I can do things with it. 
foreach(MyListBoxItem direc in studiesAndFolders)
{
    listDirectories.Items.Add(direc);
}

listbox.sorted=true не помогло, и я уверенможет быть выражение (LINQ для спасения?).Я просто собирался сделать это долгий путь с кучей случаев, когда я взял studiesAndFolders и поместил его в список.

Ответы [ 4 ]

0 голосов
/ 26 июня 2018

Для заказа на основе правильной даты вам нужно, чтобы StudyDate был типа DateTime

class MyListBoxItem
{
    public string StudyBaseFolder { get; set; }
    public string StudyName { get; set; }
    public string UserLastName { get; set; }
    public DateTime StudyDate { get; set; }
} 

Затем вы можете заказать, используя методы расширения LINQ.

var orderedDirectories = 
    directories.OrderBy(dir => dir.StudyName)
               .ThenBy(dir => dir.StudyDate);

foreach (var directory in orderedDirectories)
{
    listBox.Items.Add(directory);
}

Вы можете переопределить метод .ToString() в классе MyListBoxItem, чтобы в списке отображались элементы по вашему желанию.

class MyListBoxItem
{
    public string StudyBaseFolder { get; set; }
    public string StudyName { get; set; }
    public string UserLastName { get; set; }
    public DateTime StudyDate { get; set; }

    public override string ToString()
    {
        return $"{StudyDate:MMddyyyy}{StudyName}";
    }
}    
0 голосов
/ 26 июня 2018

Этот код сортируется по имени, затем по дате.И должно быть легко читаемым.

foreach(MyListBoxItem direc in studiesAndFolders.OrderBy(x => x.StudyName).ThenBy(x => x.StudyDate))
{
    listDirectories.Items.Add(direc);
}

Как уже отмечали другие, вы должны хранить StudyDate как DateTime, если вы не хотите, чтобы он сортировался в алфавитном порядке.

0 голосов
/ 26 июня 2018

Во-первых, измените тип StudyDate на DateTime

class MyListBoxItem
{
    ...
    public DateTime StudyDate { get; set; }
}

После этого создайте новый компаратор

public class MyListBoxItemComparer : IComparer<MyListBoxItem>
{
    public int Compare(MyListBoxItem x, MyListBoxItem y)
    {
        if (x.StudyName == y.StudyName)
        {
            return x.StudyDate.CompareTo(y.StudyDate);
        }

        return String.Compare(x.StudyName, y.StudyName, StringComparison.Ordinal);
    }
}

Наконец, используйте SortedSet вместо List

SortedSet<MyListBoxItem> studiesAndFolders = new SortedSet<MyListBoxItem>(new MyListBoxItemComparer());
0 голосов
/ 26 июня 2018

Если вы можете использовать LINQ в своем проекте, сначала вы должны сделать StudyDate типа DateTime.Тогда вы можете сделать это:

MyList.OrderBy(x => x.StudyName).ThenByDescending(x=>x.StudyDate).ToList()

...