2017-10-11 77 views
0

在我的previously asked question中,我试图显示文本文件中的特定行以显示到文本框中。即使项目不存在,程序也会显示文本文件数据c#

我试过解决Jeremy Thompson建议,甚至是pinkfloydx33(这是我坚持)建议的重构解决方案,是的两个解决方案为我工作,但我发现程序显示数据,即使字符串不存在于文件。

例如。如果我输入以下任何一项:1,01,001,2,02,002,它将继续执行代码并显示数据。任何人都可以告诉我如何解决这个问题?我试图通过限制他们的输入来解决这个问题(例如,他们必须输入4位数字,不多不少),但是我的问题是原始键的长度不同,所以我不能应用这种方法。

样本数据

项目键,添加日期,产品名称,品牌,型号

0001,10/08/2017,5s,苹果,电话

0002,10/08/2017年,S5,三星,手机

代码片段

string plist = @"sample_data.txt"; 

var line = File.ReadLines(plist).FirstOrDefault(l => l.Contains(txt_ik.Text)); 
if (line != null) 
{ 
    string[] parts = line.Split(','); 
    txt_data1.Text = parts[2]; 
    txt_data2.Text = parts[3]; 
    txt_data3.Text = parts[4]; 
    MessageBox.Show("It exists!"); 
} 
else 
{ 
    MessageBox.Show("Does not exist!"); 
} 

样本图片

编辑

很抱歉的不确定性!用户需要输入产品密钥。当您点击“提交”并且文件中存在该项目时,它应该在文本框中显示数据。如果没有,则会弹出消息说该项目不存在。

+0

目前还不清楚预期行为是什么 – DiskJunky

+0

这是否意味着'ITEM KEY'字段可以多于或少于4位?所以你可以有一个12345789的ID? – DonBoitnott

+0

@DonBoitnott是项目密钥可以是1234567890.没有特定的长度 – nik

回答

1

Contains返回true如果搜索文本存在于行的任何位置。 如果改变这一行:

var line = File.ReadLines(plist).FirstOrDefault(l => l.Contains(txt_ik.Text)); 

var line = File.ReadLines(plist).FirstOrDefault(l => l.StartsWith(String.Format("{0},", txt_ik.Text))); 

您确保项目键等于搜索项。

使用String.Format("{0},", txt_ik.Text)我们还在搜索文本中添加了一个逗号。
然后你确定第一项等于搜索文本。

+0

你是一个拯救生命的人!它现在正常工作,谢谢你传授这些知识! – nik

+0

看起来不太灵活。如果他们输入“02”,则严格匹配“02”。你不想让它也匹配“00002”或“00000000002”吗?你只是回到匹配逐字输入的内容。 – DonBoitnott

+0

@DonBoitnott你问我还是OP? – MatSnow

0

然后你需要一个不同的Linq。试试这个:

var item = sa.FirstOrDefault(x => Convert.ToInt32(x.Split(',')[0]).Equals(Convert.ToInt32(txt_ik.Text))); 
if (item != null) 
{ 
} 

需要注意的是,虽然这是非常可靠的,它也比较危险,所以你会是明智的,至少它包装在一个try-catch,但适当的检查将是最好的。

相关问题