Удаление дубликатов, которые появляются более одного раза - PullRequest
1 голос
/ 25 апреля 2020

Просто немного потренируюсь на linq, и я делаю обычные удаления элементов, которые дублируются только один раз, поэтому в приведенном ниже примере у меня есть.

Word1 Word2 Word1

Должно быть напечатано только out word 2 Вот https://dotnetfiddle.net/P47DGT - это их простой способ сделать это лучше с помощью lambada.

class Words {
    public string MyWords { get; set; }
}

public class Program    
{
    public static void Main()
{
  List<Words> _words = new List<Words>();
  _words.Add(new Words() { MyWords = "word1" });
  _words.Add(new Words() { MyWords = "word2" });
  _words.Add(new Words() { MyWords = "word1" });

   RemoveDuplicatesLinq(_words);
}   
    static void RemoveDuplicatesLinq(List<Words> _words) {
        List<Words> duplicatesRemoved = new List<Words>();
        duplicatesRemoved = _words.GroupBy(x => x)
                    .Where(group => group.Count() > 1)
                    .Select(group => group.Key).ToList();  
        foreach (var item in duplicatesRemoved) {
            Console.Write("Words Left " + item.MyWords + "\r\n");
        }
    }       
}

Он должен просто напечатать мне одно вхождение Word2, но это не

1 Ответ

4 голосов
/ 25 апреля 2020

Вы должны просто сгруппировать по MyWords и отфильтровать только группы длины 1. Затем вы можете сгруппировать группы в IEnumerable<Words> с помощью System.Linq.Enumerable.SelectMany. Поскольку вам, кажется, нужен список, мы можем добавить ToList(), чтобы преобразовать результат в List<Words>.

List<Words> duplicatesRemoved = _words
            .GroupBy(x => x.MyWords)
            .Where(group => group.Count() == 1)
            .SelectMany(group => group)
            .ToList();

foreach (var item in duplicatesRemoved)
{
    Console.Write("Words Left " + item.MyWords + "\r\n");
}

Какие выходы:

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