Сортировать 2 числа в ArrayList, используя C#? - PullRequest
0 голосов
/ 12 марта 2020

Я использую ArrayList для хранения объектов класса SocialTimes. SocialTimes содержит строку и 2 числа. Я пытаюсь сортировать по часам и минутам. Я понятия не имею, как это сделать. Может кто-нибудь мне помочь?

public class SocialTimes
{
    string DateToPostStr = "";
    int HourToPost = 0;
    int MinuteToPost = 0;

    public SocialTimes(string DateToPostStr, int HourToPost, int MinuteToPost)
    {
        this.DateToPostStr = DateToPostStr;
        this.HourToPost = HourToPost;
        this.MinuteToPost = MinuteToPost;
    }

    public string getDateToPostStr()
    {
        return this.DateToPostStr;
    }

    public int getHourToPost()
    {
        return this.HourToPost;
    }

    public int getMinuteToPost()
    {
        return this.MinuteToPost;
    }

    public static implicit operator SocialTimes(ArrayList v)
    {
        throw new NotImplementedException();
    }
}


public class myComparer : IComparer
{
    int IComparer.Compare(Object xx, Object yy)
    {
        SocialTimes x = (SocialTimes)xx;
        SocialTimes y = (SocialTimes)yy;
        return x.getHourToPost().CompareTo(y.getHourToPost());
    }
}

Так вот метод для проверки сортировки ArrayList ...

    private void testHourMinuteSort()
    {
        ArrayList projects = new ArrayList();
        projects.Add(new SocialTimes("03/14/20", 17, 7));
        projects.Add(new SocialTimes("03/14/20", 10, 39));
        projects.Add(new SocialTimes("03/14/20", 12, 7));
        projects.Add(new SocialTimes("03/14/20", 3, 16));
        projects.Add(new SocialTimes("03/14/20", 21, 8));
        projects.Add(new SocialTimes("03/14/20", 20, 56));
        projects.Add(new SocialTimes("03/14/20", 3, 2));
        projects.Sort(new myComparer());
        string hoursminutes = "";

        foreach (SocialTimes item in projects)
        {
            hoursminutes = hoursminutes + String.Format("Hour: {0} Minute: {1}", item.getHourToPost(), item.getMinuteToPost()) + Environment.NewLine;
        }

        MessageBox.Show(hoursminutes);
    }

часов минут:

  • Час: 3 Минута: 16
  • Часы: 3 минуты: 2
  • Часы: 10 минут: 39
  • Часы: 12 минут: 7
  • Часы: 17 минут: 7
  • Час: 20 минут: 56
  • Час: 21 минута: 8

Мне нужна сортировка по часам и минутам, как показано ниже.

  • Часы: 3 минуты: 2
  • Часы: 3 минуты: 16
  • Часы: 10 минут: 39
  • Часы: 12 минут: 7
  • час: 17 минут: 7
  • час: 20 минут: 56
  • час: 21 минута: 8

1 Ответ

0 голосов
/ 14 марта 2020

Преобразовать значения в минуты и сравнить, а не только часы.

int x1 = t1.Hours * 60 + t1.Minutes;

Как и сейчас, времена с одинаковым количеством (целых) часов будут отсортированы «случайным образом» по отношению друг к другу. потому что минуты не сравниваются.

В качестве альтернативы просто используйте LINQ и что-то вроде:

s.OrderBy(x => x.Hours).ThenBy(x => x.Minutes)

Вероятно, было бы также более понятно использовать Date и / или TimeSpan, который представляет даты и / или интервалы времени хорошо. В этом случае приведенный выше код будет упрощен, поскольку будет сравниваться только одно значение.

Использование правильного обобщенного типа коллекции c, такого как List , также является гораздо более современным и безопасным для типов способом иметь дело с коллекциями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...