如何使用Linq从List列表中删除重复项

时间:2017-01-15 02:28:15

标签: c# linq sorting

情景:

我有一个文本文件,我正在阅读并避免将重复的行添加到名为basket的列表中。

问题:

问题在于,以下逻辑避免重复但不添加某些行,例如ID为4的行和1未添加到basket列表中。

问题:

  • 有人可以检查一下是什么问题吗?
  • 有没有更好的方法来实现同样的目标?

(文字档案:abc.txt)

ID  ITEM    QTY SOURCE
2   Banana  4   tree
3   Milk    3   animal
5   Creme   2   animal
2   Banana  4   tree
3   Milk    3   animal
10  Banana  4   tree
4   Milk    3   animal
5   Creme   2   animal
1   Banana  4   tree
32  Milk    3   animal

(代码)

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            List<List<string>> basket = new List<List<string>>();
            var filePath = @"c:\temp\abc.txt";
            using (StreamReader stream = new StreamReader(filePath))
            {
                while (!stream.EndOfStream)
                {
                    var lineContents = stream.ReadLine().Split('\t');
                    if (!DuplicateItem(basket, lineContents))
                    {
                        basket.Add(lineContents.ToList());
                    }
                }
            }
            Console.Read();
        }

        private static bool DuplicateItem(List<List<string>> basket, string[] line)
        {
            return basket.Exists(row => row.Exists(col => col.ElementAt(0).ToString().Equals(line[0]))) ? true : false;
        }
    }
}

2 个答案:

答案 0 :(得分:0)

您检查ID的存在是无效的,因为您正在检查行的ID的第一个字符与新行的字符串ID是否相等。 (这就是为什么还需要使用ToString)。您可以简化逻辑,如:

private static bool DuplicateItem(List<List<string>> basket, string[] line)
{
    return basket.Exists(row => row[0] == line[0]);
}

答案 1 :(得分:0)

不是使用List of List,为什么不只是一个List并从那里检查副本?你可以这样做:

IList<string> basket = new List<string>();

然后在你的声明中:

if (!basket.Contains(lineContents[0].ToString()))
basket.Add(lineContents[0].ToString());

无需添加DuplicateItem静态方法。