我目前有一个多行文本框,它已从另一个来源获取了一个列表。此列表如下所示:
check = true;
我的目标是:
我正在尝试使用此textBox列表中的订单项在文本文件中查找匹配项。重要的是,当它在文本文件中找不到行匹配项时,会出现一个消息框,显示“项目不在列表中” ...并包括在文本文件中未找到的实际textBox行项目。>
我目前正在尝试以下工作:
48:5D:36:4E:63:F8
00:24:1D:23:97:CF
4C:CC:6A:F4:42:2C
我也尝试过:
string find = textBox16.Text;
foreach (string line in File.ReadAllLines("watcher.txt"))
{
if (line.Contains(find))
{
//Do nothing
}
else
{
MessageBox.Show("Item not on list");
}
}
我已经尝试了其他几种方法,但是到目前为止,我没有尝试过任何工作。任何帮助,将不胜感激。谢谢〜
答案 0 :(得分:1)
问题在于文本框的文本不是单个值:如果输入文本文件,则在每一行上查找多个值。
您也不需要将整个文件读入内存(ReadAllLines
就是这么做的),您可以从StreamReader
逐行读取,这就是您的方式可以在使用最少内存的情况下处理数千兆字节大小的文本文件:
String[] findValues = this.textBox16.Text.Split( new String[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries );
List<Int32> matchingLineNumbers = new List<Int32>();
using( StreamReader rdr = new StreamReader( "watcher.text" ) )
{
String line;
Int32 lineNumber = 1;
while( ( line = rdr.ReadLine() ) != null )
{
foreach( String value in findValues )
{
if( line.IndexOf( value, StringComparison.OrdinalIgnoreCase ) > -1 )
{
matchingLineNumbers.Add( lineNumber );
}
}
lineNumber++;
}
}
if( matchingLineNumbers.Count == 0 )
{
MessageBox.Show( "Item not on list" );
}
else
{
String message = "Matching lines: " + String.Join( ", ", matchingLineNumbers.Select( n => n.ToString() ) );
MessageBox.Show( message );
}
答案 1 :(得分:1)
我猜是这样的
var items = textBox16.Text
.Split(new[] { "\n", "\r\n" }, StringSplitOptions.RemoveEmptyEntries)
.ToList();
var lines = File.ReadAllLines("watcher.txt");
var missing = items.Where(item => !lines.Contains(item))
.ToList();
if(missing.Any())
MessageBox.Show($"Missing : \r\n {string.Join("\r\n", missing)}");
注意:对于较大的文件,有更有效的方法
来自 Dai 的重要评论
这假设您要完全匹配(如List.Contains(String) 将调用Object.Equals将执行字符串序数相等 这可能是不希望的,并且不会匹配子字符串。
也就是说,如果您的文本文件包含
48:5D:36:4E:63:F8
00:24:1D:23:97:CF
4C:CC:6A:F4:42:2C
...
和 Case 都不是问题,那么它应该可以工作