Сортировать пользовательский список классов

self.urlSession.dataTask(with: request, completionHandler: { (data, response, error) in
            self.endNetworkActivity()

            var responseError: Error? = error
            // handle http response status
            if let httpResponse = response as? HTTPURLResponse {

                if httpResponse.statusCode > 299 , httpResponse.statusCode != 422  {
                    responseError = NSError.errorForHTTPStatus(httpResponse.statusCode)
                }
            }

            var apiResponse: Response
            if let _ = responseError {
                apiResponse = Response(request, response as? HTTPURLResponse, responseError!)
                self.logError(apiResponse.error!, request: request)

                // Handle if access token is invalid
                if let nsError: NSError = responseError as NSError? , nsError.code == 401 {
                    DispatchQueue.main.async {
                        apiResponse = Response(request, response as? HTTPURLResponse, data!)
                        let message = apiResponse.message()
                        // Unautorized access
                        // User logout
                        return
                    }
                }
                else if let nsError: NSError = responseError as NSError? , nsError.code == 503 {
                    DispatchQueue.main.async {
                        apiResponse = Response(request, response as? HTTPURLResponse, data!)
                        let message = apiResponse.message()
                        // Down time
                        // Server is currently down due to some maintenance
                        return
                    }
                }

            } else {
                apiResponse = Response(request, response as? HTTPURLResponse, data!)
                self.logResponse(data!, forRequest: request)
            }

            self.removeRequestedURL(request.url!)

            DispatchQueue.main.async(execute: { () -> Void in
                completionHandler(apiResponse)
            })
        }).resume()
105
задан user2864740 29 July 2014 в 06:37
поделиться

9 ответов

Один из способов сделать это - использовать делегат

List<cTag> week = new List<cTag>();
// add some stuff to the list
// now sort
week.Sort(delegate(cTag c1, cTag c2) { return c1.date.CompareTo(c2.date); });
137
ответ дан 24 November 2019 в 03:20
поделиться
List<cTag> week = new List<cTag>();
week.Sort((x, y) => 
    DateTime.ParseExact(x.date, "dd.MM.yyyy", CultureInfo.InvariantCulture).CompareTo(
    DateTime.ParseExact(y.date, "dd.MM.yyyy", CultureInfo.InvariantCulture))
);
12
ответ дан 24 November 2019 в 03:20
поделиться

Перво-наперво, если свойство date хранит дату, сохраните ее, используя DateTime. Если вы проанализируете дату с помощью сортировки, вы должны проанализировать ее для каждого сравниваемого элемента, это не очень эффективно ...

Затем вы можете создать IComparer:

public class TagComparer : IComparer<cTag>
{
    public int Compare(cTag first, cTag second)
    {
        if (first != null && second != null)
        {
            // We can compare both properties.
            return first.date.CompareTo(second.date);
        }

        if (first == null && second == null)
        {
            // We can't compare any properties, so they are essentially equal.
            return 0;
        }

        if (first != null)
        {
            // Only the first instance is not null, so prefer that.
            return -1;
        }

        // Only the second instance is not null, so prefer that.
        return 1;
    }
}

var list = new List<cTag>();
// populate list.

list.Sort(new TagComparer());

Вы даже можете сделать это как делегат:

list.Sort((first, second) =>
          {
              if (first != null && second != null)
                  return first.date.CompareTo(second.date);

              if (first == null && second == null)
                  return 0;

              if (first != null)
                  return -1;

              return 1;
          });
7
ответ дан 24 November 2019 в 03:20
поделиться

Вы правы - вам нужно реализовать IComparable. Для этого просто объявите свой класс:

public MyClass : IComparable
{
  int IComparable.CompareTo(object obj)
  {
  }
}

В CompareTo вы просто реализуете свой собственный алгоритм сравнения (для этого вы можете использовать объекты DateTime, но сначала обязательно проверьте тип «obj»). Для получения дополнительной информации см. здесь и здесь .

5
ответ дан 24 November 2019 в 03:20
поделиться

Вы правы, что ваш класс cTag должен реализовывать интерфейс IComparable . Затем вы можете просто вызвать Sort () в своем списке.

Чтобы реализовать интерфейс IComparable , необходимо реализовать метод CompareTo (T other) . Самый простой способ сделать это - вызвать метод CompareTo поля, которое вы хотите сравнить, которым в вашем случае является дата.

public class cTag:IComparable<cTag> {
    public int id { get; set; }
    public int regnumber { get; set; }
    public string date { get; set; }
    public int CompareTo(cTag other) {
        return date.CompareTo(other.date);
    }
}

Однако такая сортировка не удалась, потому что при этом использовалась бы классическая сортировка по строкам (поскольку вы объявили дату как строку). Поэтому я думаю, что лучше всего было бы переопределить класс и объявить дату не как строку, а как DateTime. Код останется почти таким же:

public class cTag:IComparable<cTag> {
    public int id { get; set; }
    public int regnumber { get; set; }
    public DateTime date { get; set; }
    public int CompareTo(cTag other) {
        return date.CompareTo(other.date);
    }
}

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

48
ответ дан 24 November 2019 в 03:20
поделиться

В этом случае вы также можете сортировать, используя LINQ:

week = week.OrderBy(w => DateTime.Parse(w.date)).ToList();
36
ответ дан 24 November 2019 в 03:20
поделиться

Вы можете использовать linq:

var q = from tag in Week orderby Convert.ToDateTime(tag.date) select tag;
List<cTag> Sorted = q.ToList()
5
ответ дан 24 November 2019 в 03:20
поделиться

посмотрите перегруженный метод сортировки класса List. к этому есть несколько способов. один из них: ваш настраиваемый класс должен реализовывать интерфейс IComparable, тогда вы можете использовать метод Sort класса List.

3
ответ дан 24 November 2019 в 03:20
поделиться

Спасибо за все быстрые ответы.

Это мое решение:

Week.Sort(delegate(cTag c1, cTag c2) { return DateTime.Parse(c1.date).CompareTo(DateTime.Parse(c2.date)); });

Спасибо

3
ответ дан 24 November 2019 в 03:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: