基本上我从一个文本文件读取50行,每行的格式有点像这样:
David Chalmers 34
我已使用ReadAllLines
读取文本文件,因此每行应该是数组中的不同条目。
我试图从每一行获取数字并将它们存储到自己的数组中。现在我收到了错误:
索引和长度必须指代字符串中的位置。
static void getResults(string[] Text)
{
// X = lastIndexOf for ' ' (space)
// x will take position of the last space
// Results = substring
// z will be the length of the string
// z = text.Length
// Substring (x+1,z-x+1)
int lines = 50;
string[] Results = new string[lines];
for (int i = 0; i < Text.Length; i++)
{
int x = Text[i].LastIndexOf(' ');
int z = Text[i].Length;
Results[lines] = Text[i].Substring(x + 1, z - x + 1);
}
}
任何帮助将不胜感激!
答案 0 :(得分:3)
使用Split,它更容易:
String Test = "David Chalmers 34";
String[] Segments = Test.Split(' ');
Console.WriteLine(Segments[2]);
Console.ReadKey();
当然,您需要为错误的输入添加错误处理。
答案 1 :(得分:1)
您必须从子字符串长度中减去1而不是添加它:
var line = "David Chalmers 34";
var lineLength = line.Length; // == 17
var lastSpacePosition = line.LastIndexOf(' '); // == 14
var age = line.Substring(lastSpacePosition + 1, lineLength - lastSpacePosition - 1); // == 34
答案 2 :(得分:1)
你的表达应该是:
Results[lines] = Text[i].Substring(x + 1, z - x - 1);
您需要减去1而不是添加。
答案 3 :(得分:0)
你也可以在Linq的一行中完成所有这些:
var Results = Text.Take(50)
.Select(line => line.Split(' '))
.Select(sa => sa.Last())
.ToArray();
答案 4 :(得分:0)
这是我要做的事情,使用Person
课程。考虑到项目的范围,现在似乎没有必要,但如果范围不断扩大,使用类和实例将获得回报。另外,通过这种方式,您可以使用与您正在寻找的年龄相匹配的名称,这在某些时候可能是必要的。
public static List<Person> GetResults(string[] text)
{
var results = new List<Person>();
foreach(var line in text)
{
results.Add(Person.Parse(line));
}
return results;
}
public class Person
{
public string Name { get; private set; }
public int Age { get; private set; }
public Person(string name, int age)
{
Name = name;
Age = age;
}
public static Person Parse(string fromInputLine)
{
ValidateInput(fromInputLine);
var delimPosition = fromInputLine.LastIndexOf(' ');
var name = fromInputLine.Substring(0, delimPosition);
var age = Convert.ToInt32(fromInputLine.Substring(delimPosition + 1));
return new Person(name, age);
}
private static void ValidateInput(string toValidate)
{
if (!System.Text.RegularExpressions.Regex.IsMatch(toValidate, @"^.+\s+\d+$"))
throw new ArgumentException(string.Format(@"The provided input ""{0}"" is not valid.", toValidate));
}
}
答案 5 :(得分:0)
你可以在字符串类中使用.Split方法,他所做的是用空格分隔字符串,然后你得到一个字符串数组......
var entry = "David Chambers 34";
string[] result = entry.Split(" ")
然后你可以转换为整数
var age = Convert.ToInt32(result[2]);
或
var age = Int32.TryParse(result[2]);
答案 6 :(得分:0)
要将数字存储在自己的数组中,您可以尝试:
string[] numbers = text.Select(x => x.Substring(x.LastIndexOf(' '))).ToArray();
答案 7 :(得分:-1)
使用StringReader
static void getResults(string Text)
{
// X = lastIndexOf for ' ' (space)
// x will take position of the last space
// Results = substring
// z will be the length of the string
// z = text.Length
// Substring (x+1,z-x+1)
StringReader reader = new StringReader(Text);
List<string> Results = new List<string>();
string inputLine = "";
while ((inputLine = reader.ReadLine()) != null)
{
Results.Add(inputLine.Trim());
}
}