Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 搜索字符串-使用文本框搜索文本文件_C# - Fatal编程技术网

C# 搜索字符串-使用文本框搜索文本文件

C# 搜索字符串-使用文本框搜索文本文件,c#,C#,我目前有一个多行文本框,它从另一个来源获取了一个列表。该列表如下所示: 48:5D:36:4E:63:F8 00:24:1D:23:97:CF 4C:CC:6A:F4:42:2C 我的目标是: 我试图使用此文本框列表中的行项目在文本文件中查找匹配项。重要的是,当它在文本文件中找不到行匹配项时,会出现一个消息框,说明“项不在列表中”…并包含在文本文件中找不到的实际文本框行项 我目前正在尝试以下工作: string find = textBox16.Text; foreach (string li

我目前有一个多行文本框,它从另一个来源获取了一个列表。该列表如下所示:

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");
    }
}
我也试过:

foreach (string line in textBox16.Lines)
{
    if (File.ReadAllLines("watcher.txt").Contains(textBox16.Text))
    {
        //do nothing
    }
    else
    {
        MessageBox.Show("Item not on list");
    }
}

我尝试过其他几种方法,但目前为止我尝试过的方法都无法正常工作。请提供任何帮助。谢谢~

问题在于文本框的文本不是单个值:如果输入文本文件不正确,则在每行上查找多个值

您也不需要将整个文件读取到内存中(这是
ReadAllLines
所做的),您可以从
StreamReader
逐行读取它,相反,这是在使用最小内存的情况下处理多GB大小的文本文件的方法:

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  );
}
String[]findValues=this.textBox16.Text.Split(新字符串[]{“\r\n”},StringSplitOptions.RemoveEmptyEntries);
List MatchingLineNumber=新列表();
使用(StreamReader rdr=newstreamreader(“watcher.text”))
{
弦线;
Int32 lineNumber=1;
而((line=rdr.ReadLine())!=null)
{
foreach(findValues中的字符串值)
{
if(line.IndexOf(value,StringComparison.OrdinalIgnoreCase)>-1)
{
匹配行号。添加(行号);
}
}
lineNumber++;
}
}
if(matchingLineNumbers.Count==0)
{
MessageBox.Show(“列表中没有的项目”);
}
其他的
{
String message=“Matching lines:”+String.Join(“,”,matchingLineNumbers.Select(n=>n.ToString());
MessageBox.Show(message);
}

我猜是这样的

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)}");
注意:有更有效的方法来处理较大的文件

戴的重要评论


这假设您需要精确匹配(如List.Contains(字符串)) 将调用Object.Equals,它将执行字符串顺序相等 这可能是不需要的,并且与子字符串不匹配

例如,如果您的文本文件包含

48:5D:36:4E:63:F8
00:24:1D:23:97:CF
4C:CC:6A:F4:42:2C
...

如果大小写没有问题,那么它应该可以工作

您是否尝试过Trim().ToLower()或StringComparer.ordinallingorecase?这假设您需要精确匹配(如
List.Contains(字符串))
将调用
Object.Equals
,它将执行可能不需要的字符串顺序相等,并且不匹配子字符串。@Dai明确理解并假设,我将记下澄清最后一个问题如果可以的话,请回答一般性问题….(一点历史)从网络扫描的listview结果列表中获取的textbox列表是在计时器上设置的。当我清除textbox进行新扫描时,代码将找不到丢失的项目。但是如果我不清除textbox并让扫描结果堆叠,它工作得很好-对可能发生的情况有什么想法吗?@Rick如果是线程计时器,请告诉我需要
锁定
对文本框的访问以确保线程安全。@Rick如果列表中没有任何项目,那么它就有意义了,那么就不会找到丢失的项目。这些项目不在那里。您是在扫描后即时运行搜索,还是定时运行搜索?谢谢!我一直在尝试细分和研究以了解响应。Both是如此的不同,但两者都开始有意义。两种回答(Dai和TheGeneral)都适用于我的场景。我需要研究和吸收这两种不同的方法,以更好地理解为什么/如果一种方法比另一种更有效。非常感谢各位送我走上正确的道路。