Получить экземпляры от пересечения - PullRequest
0 голосов
/ 18 апреля 2020

У меня есть следующий список тегов:

List<Tag> tags = new List<Tag> {
  new Tag { Name = "Book", Slug = "book" },
  new Tag { Name = "Travel", Slug = "travel" } 
}

И у меня есть список сообщений, где у каждого сообщения есть несколько тегов:

List<Post> model = new List<Post> {
  new Post {
    Title = "First Post",
    Tags = new List<Tag> { 
      new Tag { Name = "Book", Slug = "book" },
      new Tag { Name = "Europe", Slug = "europe" } 
    },
  },
  new Post {
    Title = "Second Post",
    Tags = new List<Tag> { 
      new Tag { Name = "Travel", Slug = "travel" },
      new Tag { Name = "Europe", Slug = "europe" } 
    }
  }
};

Для каждого сообщения мне нужно переопределить теги, основанные на слаге, с экземплярами в тэгах.

В первом посте есть два тега со следующими слагами book и europe.

Мне нужно получить от tags первый, потому что в тегах поста есть слаг book.

Тогда свойство тегов поста будет:

List<Tag> tags = new List<Tag> {
  tags[0]
}

Так что мне нужно использовать экземпляр в тегах .

Как я могу это сделать?

Ответы [ 2 ]

3 голосов
/ 18 апреля 2020

Если вы хотите удалить теги, которых нет в списке tags (на основе свойства Slug), и заменить экземпляры Tag на экземпляры, объявленные в переменной tags, вы можете сделать это:

foreach (var post in model)
{
    post.Tags = tags.Where(t => post.Tags.Any(u => u.Slug == t.Slug)).ToList();
}

Это не создает новые Post экземпляры, как в ответе @Sajid.

0 голосов
/ 18 апреля 2020

Другим решением может быть создание класса IEqualityComparer<Tag>:

public class TagEqualityComparer : IEqualityComparer<Tag>
{
    public bool Equals(Tag x, Tag y)
    {
        return x.Slug == y.Slug;
    }

    public int GetHashCode(Tag obj)
    {
        return obj.Slug.GetHashCode();
    }
}

. Затем передайте этот компаратор в Enumerable.Intersect из LINQ, чтобы найти пересекающиеся теги:

var result = model
    .Select(post => new Post
    {
        Title = post.Title,
        Tags = post.Tags.Intersect(tags, new TagEqualityComparer()).ToList()
    })
    .ToList();

Возможно, это будет излишним для вашего сценария, но так как вы упомянули пересечение , я не думал, что будет плохой идеей опубликовать это.

Если класс Tag становится больше с большим количеством свойств, то вышеупомянутое решение также может быть полезным, поскольку вы можете просто обновить методы Equals и GetHashCode и вместо этого передать компаратор.

Вы также можете повторно использовать тот же компаратор для других методов LINQ, таких как Except, OrderBy, SequenceEqual et c., Что также может быть полезным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...