情景:
我有一个文本文件,我正在阅读并避免将重复的行添加到名为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;
}
}
}
答案 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静态方法。