Ordina per proprietà Enum diversa per ogni riga

1

Quindi ho una lista di elementi DefaultSearchModal che hanno un enum chiamato TypeSearch in ogni elemento della lista. Vorrei ordinare alla lista di avere una proprietà enum diversa per ogni riga.

Quindi se hai un elenco non ordinato di questo:

1,1,2,2,3,3,4,4,5,5,5,5,5,5

Vorrei ordinarlo a:

1,2,3,4,5,1,2,3,4,5,5,5,5,5

Quale sarebbe un buon algoritmo per ordinarlo in questo modo?

    public class DefaultSearchModel
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
    public string Url { get; set; }
    public TypeSearch TypeSearch { get; set; }
}

public enum TypeSearch
        {
           News = 0,
           Blog = 1,
           Photo = 3,
           Page = 4
        }
    
posta Jamie 05.11.2014 - 21:06
fonte

4 risposte

1

Personalmente lo metterei semplicemente in un loop. Ecco il codice psudo per questo.

while mainList has items
{
  find first 0 item.
  add to queue, 
  remove from mailList

  find first 1 item 
  add to queue, 
  remove from mailList

  find first 3 item.
  add to queue, 
  remove from mailList

  find first 4 item.
  add to queue, 
  remove from mailList
}

return queue
    
risposta data 05.11.2014 - 22:38
fonte
0

Il risultato finale grazie al bowlturner:

  private IEnumerable<DefaultSearchModel> Sort(IList<DefaultSearchModel> items)
    {
        var returnList = new Collection<DefaultSearchModel>();

        while (items.Any())
        {
            foreach (var type in Enum.GetValues(typeof (TypeSearch)))
            {
                if (items.Any(x => x.TypeSearch == (TypeSearch) type))
                {
                    var item = items.FirstOrDefault(x => x.TypeSearch == (TypeSearch) type);
                    returnList.Add(item);
                    items.Remove(item);
                }
            }
        }

        return returnList;
    }
    
risposta data 05.11.2014 - 22:51
fonte
0

La mia soluzione aromatizzata con FP:

IEnumerable<DefaultSearchModel> DoMagic(IEnumerable<DefaultSearchModel> models)
{
    var groups = models.GroupBy(model => model.TypeSearch);
    var solution = Enumerable
        .Range(0, groups.Max(grp => grp.Count()))
        .SelectMany(i => groups
            .Where(grp => grp.Count() > i)
            .Select(grp => grp.ElementAt(i))
            .OrderBy(model => model.TypeSearch));
    return solution;
}

Probabilmente non è nemmeno il più efficiente (poiché ho sottolineato che la soluzione di @ Jamie non lo è, non posso essere un ipocrita), ma non è il mio punto in questo momento. Volevo solo mostrare come può essere LINQ tetro e non imperativo.

Nota che non stiamo ripetutamente cercando i valori di TypeSearch che non sono affatto nell'elenco, o il cui conteggio è al di là di una soglia specifica.

    
risposta data 05.11.2014 - 23:19
fonte
0
  1. Vai una volta lungo l'elenco e dividili in 5 serie.
  2. Quindi, basta prendere un oggetto (se disponibile) da ciascun set in ordine e inserirli la tua lista di output
  3. Ripeti il passaggio 2 finché tutti i set non sono vuoti

Algorithm ha O (n)

    
risposta data 06.11.2014 - 15:47
fonte

Leggi altre domande sui tag