Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.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# 如何循环使用IEnumerable<;字符串>;并创建另一个IEnumerable<;字符串>;?_C#_.net_Linq_Ienumerable_Projection - Fatal编程技术网

C# 如何循环使用IEnumerable<;字符串>;并创建另一个IEnumerable<;字符串>;?

C# 如何循环使用IEnumerable<;字符串>;并创建另一个IEnumerable<;字符串>;?,c#,.net,linq,ienumerable,projection,C#,.net,Linq,Ienumerable,Projection,我有一段代码,用于处理IEnumerable文本中的字符串 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)

我有一段代码,用于处理
IEnumerable
文本中的字符串

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
,其中字符串只是
newLine.Trim()的内容


有人能告诉我怎么做吗?

只是
返回
foreach
循环中的值

使您的方法返回
IEnumerable
,您将被设置为:

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();
    }
}
public IEnumerable MethodX(字符串[]文本)
{
foreach(文本中的var行)
{
var newLine=“”;
var ln=第行TrimStart(“”);
var colon=line.IndexOf(“:”);
if(冒号!=-1)
{
if(ln.StartsWith(“adj”))newLine=“j1”+行子字符串(冒号);
如果(ln.StartsWith(“adv”))newLine=“d1”+行子字符串(冒号);
如果(ln.StartsWith(“n”))newLine=“n1”+行子字符串(冒号);
如果(ln.StartsWith(“v”))newLine=“v1”+行子字符串(冒号);
}
其他的
{
换行符=换行符;
}
屈服返回换行符.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;
}
你可以用


您正在寻找
。选择()
为什么要投反对票?我的答案怎么了?有什么改进的建议吗?不是我的DV,但方法应该是可枚举的,而不是字符串。
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;
}
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();
    });