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()
Один из способов сделать это - использовать делегат
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); });
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))
);
Перво-наперво, если свойство 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;
});
Вы правы - вам нужно реализовать IComparable. Для этого просто объявите свой класс:
public MyClass : IComparable
{
int IComparable.CompareTo(object obj)
{
}
}
В CompareTo вы просто реализуете свой собственный алгоритм сравнения (для этого вы можете использовать объекты DateTime, но сначала обязательно проверьте тип «obj»). Для получения дополнительной информации см. здесь и здесь .
Вы правы, что ваш класс 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)
.
В этом случае вы также можете сортировать, используя LINQ:
week = week.OrderBy(w => DateTime.Parse(w.date)).ToList();
Вы можете использовать linq:
var q = from tag in Week orderby Convert.ToDateTime(tag.date) select tag;
List<cTag> Sorted = q.ToList()
посмотрите перегруженный метод сортировки класса List. к этому есть несколько способов. один из них: ваш настраиваемый класс должен реализовывать интерфейс IComparable, тогда вы можете использовать метод Sort класса List.
Спасибо за все быстрые ответы.
Это мое решение:
Week.Sort(delegate(cTag c1, cTag c2) { return DateTime.Parse(c1.date).CompareTo(DateTime.Parse(c2.date)); });
Спасибо