只是在 linq 上练习了一下,我正在执行通常的删除仅重复多次的项目,所以在下面的示例中我有。
字1 字2 字1
它应该只打印出单词 2 这是一个https://dotnetfiddle.net/P47DGT是他们用 lambda 更好地做到这一点的简单方法。
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");
}
}
}
Run Code Online (Sandbox Code Playgroud)
它应该只打印出一次出现的 Word2 但它不是
您应该只分组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");
}
Run Code Online (Sandbox Code Playgroud)
哪个输出:
Words Left word2
Run Code Online (Sandbox Code Playgroud)