所以我尝试了一些研究,但我不知道如何谷歌这个..
例如,我得到了一个.db(与我的.txt相同)文件,如下所示:
DIRT: 3;
STONE: 6;
到目前为止,我有一个代码可以将项目放在这样的组合框中:
DIRT,
STONE,
将DIRT和STONE放在comboBox中。这是我用过的代码:
string[] lineOfContents = System.IO.File.ReadAllLines(dbfile);
foreach (var line in lineOfContents)
{
string[] tokens = line.Split(',');
comboBox1.Items.Add(tokens[0]);
}
我如何扩展它以便例如组合框中的DIRT和STONE,并将其余的(3)保留在变量中(整数,如int varDIRT = 3)? 如果你愿意,它不必是txt或db文件..我听说xml也是配置文件。
答案 0 :(得分:2)
尝试做这样的事情:
cmb.DataSource = File.ReadAllLines("filePath").Select(d => new
{
Name = d.Split(',').First(),
Value = Convert.ToInt32(d.Split(',').Last().Replace(";",""))
}).ToList();
cmb.DisplayMember = "Name";
cmb.ValueMember= "Value";
请记住它需要使用using System.Linq;
如果您想要引用您可以使用的组合框的选定值
cmb.SelectedValue;
cmb.SelectedText;
答案 1 :(得分:1)
我认为你真的有两个问题,所以我会尝试单独回答。
第一个问题是“如何解析看起来像这样的文件......
DIRT: 3;
STONE: 6;
到名称和整数?“你可以从每一行中删除所有的空格和分号,然后在冒号上拆分。在我看来,更简洁的方法是使用正则表达式:
// load your file
var fileLines = new[]
{
"DIRT: 3;",
"STONE: 6;"
};
// This regular expression will match anything that
// begins with some letters, then has a colon followed
// by optional whitespace ending in a number and a semicolon.
var regex = new Regex(@"(\w+):\s*([0-9])+;", RegexOptions.Compiled);
foreach (var line in fileLines)
{
// Puts the tokens into an array.
// The zeroth token will be the entire matching string.
// Further tokens will be the contents of the parentheses in the expression.
var tokens = regex.Match(line).Groups;
// This is the name from the line, i.e "DIRT" or "STONE"
var name = tokens[1].Value;
// This is the numerical value from the same line.
var value = int.Parse(tokens[2].Value);
}
如果您不熟悉正则表达式,我建议您查看它们;它们可以很容易地格式化字符串并提取值。 http://regexone.com/
第二个问题,“如何将价值与名称一起存储?”,我不确定我是否完全理解。如果您要做的是使用文件中指定的数值返回每个项目, dub stylee 的建议对您有好处。您需要将名称作为显示成员,将值作为值成员。但是,由于您的数据不在表中,因此您必须将数据放在可访问的位置,以便可以命名要使用的属性。我推荐一本字典:
// This is your ComboBox.
var comboBox = new ComboBox();
// load your file
var fileLines = new[]
{
"DIRT: 3;",
"STONE: 6;"
};
// This regular expression will match anything that
// begins with some letters, then has a colon followed
// by optional whitespace ending in a number and a semicolon.
var regex = new Regex(@"(\w+):\s*([0-9])+;", RegexOptions.Compiled);
// This does the same as the foreach loop did, but it puts the results into a dictionary.
var dictionary = fileLines.Select(line => regex.Match(line).Groups)
.ToDictionary(tokens => tokens[1].Value, tokens => int.Parse(tokens[2].Value));
// When you enumerate a dictionary, you get the entries as KeyValuePair objects.
foreach (var kvp in dictionary) comboBox.Items.Add(kvp);
// DisplayMember and ValueMember need to be set to
// the names of usable properties on the item type.
// KeyValue pair has "Key" and "Value" properties.
comboBox.DisplayMember = "Key";
comboBox.ValueMember = "Value";
在这个版本中,我使用Linq构建字典。如果您不喜欢Linq语法,则可以改为使用循环:
var dictionary = new Dictionary<string, int>();
foreach (var line in fileLines)
{
var tokens = regex.Match(line).Groups;
dictionary.Add(tokens[1].Value, int.Parse(tokens[2].Value));
}
答案 2 :(得分:0)
您也可以使用FileHelpers库。首先定义您的数据记录。
[DelimitedRecord(":")]
public class Record
{
public string Name;
[FieldTrim(TrimMode.Right,';')]
public int Value;
}
然后你就像这样阅读你的数据:
FileHelperEngine engine = new FileHelperEngine(typeof(Record));
//Read from file
Record[] res = engine.ReadFile("FileIn.txt") as Record[];
// write to file
engine.WriteFile("FileOut.txt", res);