如何循环遍历一个 IEnumerable<string> 并创建另一个 IEnumerable<string>?
How can I loop through an IEnumerable<string> and create another IEnumerable<string>?
我有这段代码用于处理 IEnumerable<string>
文本中的字符串
foreach (var line in text)
{
var newLine = "";
var ln = line.TrimStart(' ');
var colon = line.IndexOf(":");
if (colon != -1)
{
if (ln.StartsWith("adj")) newLine = "j 1" + line.Substring(colon);
else if (ln.StartsWith("adv")) newLine = "d 1" + line.Substring(colon);
else if (ln.StartsWith("n")) newLine = "n 1" + line.Substring(colon);
else if (ln.StartsWith("v")) newLine = "v 1" + line.Substring(colon);
}
else
{
newLine = line;
}
}
现在它只是循环遍历 IEnumerable
但我想要的是创建另一个 IEnumerable<string>
其中字符串只是 newLine.Trim()
[=17= 的内容]
谁能告诉我如何做到这一点?
只是 yield return
foreach
循环中的值。
制定您的方法 return IEnumerable<string>
您将被设置为:
public IEnumerable<string> MethodX(string[] text)
{
foreach (var line in text)
{
var newLine = "";
var ln = line.TrimStart(' ');
var colon = line.IndexOf(":");
if (colon != -1)
{
if (ln.StartsWith("adj")) newLine = "j 1" + line.Substring(colon);
else if (ln.StartsWith("adv")) newLine = "d 1" + line.Substring(colon);
else if (ln.StartsWith("n")) newLine = "n 1" + line.Substring(colon);
else if (ln.StartsWith("v")) newLine = "v 1" + line.Substring(colon);
}
else
{
newLine = line;
}
yield return newLine.Trim();
}
}
var trimmedStrings = untrimmedStrings.Select(untrimmed => untrimmed.Trim());
将其应用到您上面的代码中,
var trimmedLines = text.Select(untrimmed => untrimmed.TrimStart(' '));
但为了提高可读性,我会将整个内容放在一个函数中,该函数的名称说明您在做什么。这使得 main 方法更短,当您阅读它时,函数名称就像注释一样。
string ConvertToSomeOtherString(string input) //don't use this name.
{
var newLine = "";
var ln = input.TrimStart(' ');
var colon = input.IndexOf(":");
if (colon != -1)
{
if (ln.StartsWith("adj")) newLine = "j 1" + input.Substring(colon);
else if (ln.StartsWith("adv")) newLine = "d 1" + input.Substring(colon);
else if (ln.StartsWith("n")) newLine = "n 1" + input.Substring(colon);
else if (ln.StartsWith("v")) newLine = "v 1" + input.Substring(colon);
}
else
{
newLine = input;
}
return newLine.Trim();
}
现在现有的方法将如下所示:
var convertedStrings = text.Select(line => ConvertToSomeOtherString(line));
之前,如果有人读到这篇文章,他们可以看到您正在用这个字符串做很多事情,但它对这个字符串做了什么,为什么?现在他们阅读了 main 方法,函数名说明了你在做什么。如果他们不关心这种转变的细节,他们可以继续阅读。如果他们关心它在做什么,他们只需要进入该功能。
我重构了一点,只是为了看看它会是什么样子。
string ConvertToSomeOtherString(string input) //don't use this name.
{
var colonPosition = input.IndexOf(":");
if (colonPosition == -1) return input.Trim();
var prefix = GetPrefix(input);
return string.IsNullOrEmpty(prefix)
? string.Empty
: (prefix + input.Substring(colonPosition)).Trim();
}
string GetPrefix(string input) //Again, perhaps not the best name - I don't know what these are.
{
var trimmed = input.TrimStart(' ');
if (trimmed.StartsWith("adj")) return "j 1";
if (trimmed.StartsWith("adv")) return "d 1";
if (trimmed.StartsWith("n")) return "n 1" ;
if (trimmed.StartsWith("v")) return "v 1" ;
return null;
}
您可以使用Select
var result = text.Select(line =>
{
var newLine = "";
var ln = line.TrimStart(' ');
var colon = line.IndexOf(":");
if (colon != -1)
{
if (ln.StartsWith("adj")) newLine = "j 1" + line.Substring(colon);
else if (ln.StartsWith("adv")) newLine = "d 1" + line.Substring(colon);
else if (ln.StartsWith("n")) newLine = "n 1" + line.Substring(colon);
else if (ln.StartsWith("v")) newLine = "v 1" + line.Substring(colon);
}
else
{
newLine = line;
}
return newLine.Trim();
});
我有这段代码用于处理 IEnumerable<string>
文本中的字符串
foreach (var line in text)
{
var newLine = "";
var ln = line.TrimStart(' ');
var colon = line.IndexOf(":");
if (colon != -1)
{
if (ln.StartsWith("adj")) newLine = "j 1" + line.Substring(colon);
else if (ln.StartsWith("adv")) newLine = "d 1" + line.Substring(colon);
else if (ln.StartsWith("n")) newLine = "n 1" + line.Substring(colon);
else if (ln.StartsWith("v")) newLine = "v 1" + line.Substring(colon);
}
else
{
newLine = line;
}
}
现在它只是循环遍历 IEnumerable
但我想要的是创建另一个 IEnumerable<string>
其中字符串只是 newLine.Trim()
[=17= 的内容]
谁能告诉我如何做到这一点?
只是 yield return
foreach
循环中的值。
制定您的方法 return IEnumerable<string>
您将被设置为:
public IEnumerable<string> MethodX(string[] text)
{
foreach (var line in text)
{
var newLine = "";
var ln = line.TrimStart(' ');
var colon = line.IndexOf(":");
if (colon != -1)
{
if (ln.StartsWith("adj")) newLine = "j 1" + line.Substring(colon);
else if (ln.StartsWith("adv")) newLine = "d 1" + line.Substring(colon);
else if (ln.StartsWith("n")) newLine = "n 1" + line.Substring(colon);
else if (ln.StartsWith("v")) newLine = "v 1" + line.Substring(colon);
}
else
{
newLine = line;
}
yield return newLine.Trim();
}
}
var trimmedStrings = untrimmedStrings.Select(untrimmed => untrimmed.Trim());
将其应用到您上面的代码中,
var trimmedLines = text.Select(untrimmed => untrimmed.TrimStart(' '));
但为了提高可读性,我会将整个内容放在一个函数中,该函数的名称说明您在做什么。这使得 main 方法更短,当您阅读它时,函数名称就像注释一样。
string ConvertToSomeOtherString(string input) //don't use this name.
{
var newLine = "";
var ln = input.TrimStart(' ');
var colon = input.IndexOf(":");
if (colon != -1)
{
if (ln.StartsWith("adj")) newLine = "j 1" + input.Substring(colon);
else if (ln.StartsWith("adv")) newLine = "d 1" + input.Substring(colon);
else if (ln.StartsWith("n")) newLine = "n 1" + input.Substring(colon);
else if (ln.StartsWith("v")) newLine = "v 1" + input.Substring(colon);
}
else
{
newLine = input;
}
return newLine.Trim();
}
现在现有的方法将如下所示:
var convertedStrings = text.Select(line => ConvertToSomeOtherString(line));
之前,如果有人读到这篇文章,他们可以看到您正在用这个字符串做很多事情,但它对这个字符串做了什么,为什么?现在他们阅读了 main 方法,函数名说明了你在做什么。如果他们不关心这种转变的细节,他们可以继续阅读。如果他们关心它在做什么,他们只需要进入该功能。
我重构了一点,只是为了看看它会是什么样子。
string ConvertToSomeOtherString(string input) //don't use this name.
{
var colonPosition = input.IndexOf(":");
if (colonPosition == -1) return input.Trim();
var prefix = GetPrefix(input);
return string.IsNullOrEmpty(prefix)
? string.Empty
: (prefix + input.Substring(colonPosition)).Trim();
}
string GetPrefix(string input) //Again, perhaps not the best name - I don't know what these are.
{
var trimmed = input.TrimStart(' ');
if (trimmed.StartsWith("adj")) return "j 1";
if (trimmed.StartsWith("adv")) return "d 1";
if (trimmed.StartsWith("n")) return "n 1" ;
if (trimmed.StartsWith("v")) return "v 1" ;
return null;
}
您可以使用Select
var result = text.Select(line =>
{
var newLine = "";
var ln = line.TrimStart(' ');
var colon = line.IndexOf(":");
if (colon != -1)
{
if (ln.StartsWith("adj")) newLine = "j 1" + line.Substring(colon);
else if (ln.StartsWith("adv")) newLine = "d 1" + line.Substring(colon);
else if (ln.StartsWith("n")) newLine = "n 1" + line.Substring(colon);
else if (ln.StartsWith("v")) newLine = "v 1" + line.Substring(colon);
}
else
{
newLine = line;
}
return newLine.Trim();
});