Domanda

Ho una lezione

public class PAUserAllowedTimesModel
{
    public List<AllowedTime> Times { get; set; }
    public List<AllowedTime> BusyTimes { get; set; }
    public DateTime SelectedDate { get; set; }
    public int DateID { get; set; }
}

Ho un elenco di oggetti di questa classe:

List<PAUserAllowedTimesModel> model = ...

Voglio ordinare questa raccolta per selezione. Cerco:

public class PAUserAllowedTimesModelComparer : IComparer<ITW2012Mobile.ViewModels.PAUserAllowedTimesModel>
{
    public int Compare(ViewModels.PAUserAllowedTimesModel x, ViewModels.PAUserAllowedTimesModel y)
    {
        if (x.SelectedDate > y.SelectedDate)
            return 0;
        else
            return 1;
    }
}

poi

model.Sort(new PAUserAllowedTimesModelComparer());

Ma mescola solo elementi, non ordinare. Che c'è?

È stato utile?

Soluzione

Il tuo confronto lo farà mai restituire -1, quindi viola il Compare contrarre...

Fortunatamente puoi renderlo molto più semplice comunque:

public int Compare(ViewModels.PAUserAllowedTimesModel x, 
                   ViewModels.PAUserAllowedTimesModel y)
{
    // Possibly reverse this, depending on what you're trying to do
    return x.SelectedDate.CompareTo(y.SelectedDate);
}

O usando Linq:

model = model.OrderBy(x => x.SelectedDate).ToList();

Si noti che questo non fa un a posto Ordina, a differenza di List<T>.Sort.

Altri suggerimenti

La tua implementazione di IComparer è sbagliato. Devi restituire 0 se gli elementi sono pari, 1 se x > y e -1 se y > x o viceversa, a seconda che tu voglia ordinare la discesa o l'ascesa.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top