Sort a list of objects by a string list

0

I would like in the GetAll function to already bring the list of posts in order according to the list of IDs passed by the module.Higlights

List<Post> posts = new List<Post>();
var posts = PostService.GetAll(module.Highlights).ToList();
var postsAux = posts;
posts.Clear();
foreach (var item in module.Highlights){    
  var post = postAux.FirstOrDefault(p => p.Id == item);
  if(post != null)
     posts.Add(post);    
}

The system uses IMongoCollection :

public IEnumerable<Post> GetAll<Post>(IEnumerable<string> ids)
{
  if (ids == null)
    return new List<Post>();

  var collection = Db.GetCollection<Post>(typeof(Post).Name);

  var filter = Builders<Post>.Filter.In("Id", ids);

  return collection.Find(filter).ToList();
}

I have tried the following unsuccessful code:

var query = from i in ids 
        join o in collection..AsQueryable()
        on i equals o.Id
        select o;
    
asked by anonymous 27.10.2017 / 03:16

1 answer

0

First, let's review your code, as it may be creating issues outside the scope of the question.

// Linha é irrelevante. A variavel 'posts' será sobrescrita na proxima linha
// Ela deve ser removida
// List<Post> posts = new List<Post>();  // REMOVER
var posts = PostService.GetAll(module.Highlights).ToList();

// Objetos complexos são atribuidos por referência, sendo assim,
// 'postAux' e 'posts' são EXATAMENTE O MESMO OBJETO, são a mesma lista
// O que mexer em um, mexe no outro.
var postsAux = posts;
// Aqui limpou as duas listas, 'posts' e 'postAux'
posts.Clear();

// Esse esquema é reordenar lista é ruim, pois causa MEMORY LEAK
// Vc está duplicando as listas, o que é desnecessário,
// Aumentando processamento e consumo de memória
foreach (var item in module.Highlights){    
  var post = postAux.FirstOrDefault(p => p.Id == item);
  if(post != null)
     posts.Add(post);    
}

Here's how to sort by avoiding memory leak .

    // Faz a consulta normalmente
    var posts = _postService.Find(module_Highlights).ToList();

    // Reordena de acordo com os ids usados na pesquisa
    for (var i = module_Highlights.Length-1; i >= 0; i--)
    {
        var id = module_Highlights[i];
        var post = posts.Single(p=>p.Id.ToString().Equals(id));

        // usa a tecnica de pop and push para evitar memory leak
        posts.Remove(post);
        posts.Insert(0, post);
    }

See working in .NET Fiddle .

    
27.10.2017 / 11:55