C# 在txt文件上执行搜索功能
我正在尝试创建一个搜索函数,这样当我搜索白色时,它应该返回我“#FFFFFF”。此外,它应该不区分大小写,并支持部分名称输入。我拥有的文本文件包含以下格式的所有颜色编码信息:C# 在txt文件上执行搜索功能,c#,visual-studio-2010,c#-4.0,webforms,full-text-search,C#,Visual Studio 2010,C# 4.0,Webforms,Full Text Search,我正在尝试创建一个搜索函数,这样当我搜索白色时,它应该返回我“#FFFFFF”。此外,它应该不区分大小写,并支持部分名称输入。我拥有的文本文件包含以下格式的所有颜色编码信息: "#FFFFFF"#White: "#FF0000"#Red: 到目前为止,我已经理解并做了如下工作:;这基本上是映射到文本文件,并指示它写入行,直到文档结束。我不明白的是如何实现上述要求 我知道这并不多,但我不理解搜索功能背后的概念 protected void search_Click(object sender,
"#FFFFFF"#White: "#FF0000"#Red:
到目前为止,我已经理解并做了如下工作:;这基本上是映射到文本文件,并指示它写入行,直到文档结束。我不明白的是如何实现上述要求
我知道这并不多,但我不理解搜索功能背后的概念
protected void search_Click(object sender, EventArgs e)
{
StreamReader sr = new StreamReader("colorCode.txt");
string line = null;
while((line =sr.ReadLine()) !=null)
{
}
在此示例中,
colorCode
存储与colorToSearch
protected void search_Click(object sender, EventArgs e)
{
StreamReader sr = new StreamReader("colorCode.txt");
string line = null;
char []colorSeparator = { ':' } ;
string []colors ;
char []colorCodeSeparator = { '#' } ;
string []codeAndColor ;
bool found ;
string colorToSearch ;
string colorCode ;
colorToSearch = "White" ;
found = false ;
while(!found && (line =sr.ReadLine()) !=null)
{
//separate the content of the file "#FFFFFF"#White: "#FF0000"#Red: using ":" as separator
colors = line.Split(colorSeparator) ;
foreach(string color in colors)
{
codeAndColor = colors.Split(colorCodeSeparator) ;
//codeAndColor[0] now contains the colorCode "#FFFFFF"
//codeAndColor[1] contains the name of the color "White"
//check if the name of the color in the file contains the colorToSearch allowing for case insensitive
if(codeAndColor[1].ToUpper().Contains(colorToSearch.ToUpper()))
{
colorCode = codeAndColor[0].Substring(1,7) ; //the 1 is to skip the initial double quote, 7 is the number of caracter to take
found = true ;
//stop the foreach loop
break ;
}
}
}
}
如果您要进行更多搜索,我建议您仅从文件中加载一次
字典中的颜色,并在字典中执行搜索,而不是每次打开文件,如果文件不太大且在程序运行时未更新,也许您可以只读取一次,然后创建一个可以搜索的查找表,如下面的示例所示。如果您需要不区分大小写的比较,或者需要一种更复杂的方法来进行部分颜色匹配,那么您需要添加它
public class ColorLookUpTable
{
private readonly IDictionary<string, string> _colorTable;
private ColorLookUpTable(IDictionary<string, string> colorTable)
{
_colorTable = colorTable;
}
public static ColorLookUpTable LoadFromFile(string fileName)
{
var colorTable = new Dictionary<string, string>();
using (var reader = File.OpenText(fileName))
{
while (!reader.EndOfStream)
{
var line = reader.ReadLine();
var colorPairs = line
.Split(new [] { ':' }, StringSplitOptions.RemoveEmptyEntries)
.Where(f => !string.IsNullOrWhiteSpace(f))
.Select(f => f.Trim());
foreach (var colorPair in colorPairs)
{
var fields = colorPair.Split(new [] { '#' }, StringSplitOptions.RemoveEmptyEntries).ToArray();
if (fields.Length == 2)
colorTable[fields[1]] = colorTable[fields[0]];
}
}
}
return new ColorLookUpTable(colorTable);
}
public string FindColorCodeExactMatch(string colorName)
{
string colorCode = null;
if (_colorTable.TryGetValue(colorName, out colorCode))
return colorCode;
return null;
}
public string FindColorCodePartialMatch(string colorName)
{
var colorCode = FindColorCodeExactMatch(colorName);
if (colorCode == null) // No exact match. Need to do work
// very simple partial mathching.
colorCode = _colorTable.Keys.Where(k => k.Contains(colorName)).FirstOrDefault();
return colorCode;
}
}
根据文件的大小,我可能会考虑将文件的整个内容读入字符串,然后使用正则表达式来执行搜索。这正是我要找的。嗨,毛里西奥,我能和你核实一下布尔发现的bool的目的是什么吗代码>是用来存储颜色的吗?以及子串(1,7)的作用代码>执行?表的实现也是这样吗?替换字符串[]颜色
;使用var colors\u store=new Dictionary()只取“234567”色码,跳过双引号这是我根据你的建议所做的而(!found&&(line=reader.ReadLine())!=null){countries=line.Split(颜色分隔符);foreach(颜色中的字符串颜色){if(color.IndexOf(颜色搜索)){color\u code=color;found=false;Label2.Text=country\u code;}`很抱歉。我发现你的代码最终更容易理解。关于显示所有相关搜索而不是一行,我该怎么做?示例a搜索“B”应生成所有“B”的结果,例如蓝色、黑色、棕色。
var myColorLookupTable = ColorLookUpTable.LoadFromFile("colorCode.txt");
var colorCode = myColorLookupTable.FindColorCodeExactMatch("White");
var another = myColorLookupTable.FindColorCodePartialMatch("ack");