Sort a list of objects by a string list

Asked

Viewed 325 times

0

I’d like to serve Getall already brought the list of posts in order according to the list of Ids passed by the parameter 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 the 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 code unsuccessfully:

var query = from i in ids 
        join o in collection..AsQueryable()
        on i equals o.Id
        select o;

1 answer

0


First, let’s review your code, because it may be creating problems 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);    
}

Follows how to make the ordination, 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 on . NET Fiddle.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.