0

長さが 1 の場合、配列内の 2 つ以上の連続する項目を結合する際に助けが必要です。

たとえば、これを変更したい:

string[] str = { "one", "two", "three","f","o","u","r" };

に :

str = {"one","two","three","four"};
4

5 に答える 5

4

GroupAdjacent拡張機能 (ここにリストされているものなど)を使用すると、次のようなことができます。

string[] input = ...

string[] output = input.GroupAdjacent(item => item.Length == 1)
                       .SelectMany(group => group.Key 
                                          ? new[] { string.Concat(group) } 
                                          : group.AsEnumerable())
                      .ToArray();

ここで効率が大きな問題になる場合は、独自のイテレータ ブロックなどをローリングすることをお勧めします。

于 2013-03-03T15:27:48.117 に答える
0

最も簡単で効率的な方法は、配列を反復処理することだと思います。

string[] str = { "one", "two", "three", "f", "o", "u", "r" };
List<string> output = new List<string>();
StringBuilder builder = null;
bool merge = false;

foreach(string item in str)
{
    if (item.Length == 1)
    {
        if (!merge)
        {
            merge = true;
            builder = new StringBuilder();
        }
        builder.Append(item);
    }
    else
    {
        if (merge)
            output.Add(merge.ToString());
        merge = false;
        output.Add(item);
    }
}
if (merge)
    output.Add(builder.ToString());
于 2013-03-03T15:37:04.387 に答える
0

あなたはこれを行うことができます:

string[] str = { "one", "two", "three", "f", "o", "u", "r" };
var result = new List<string>();
int i = 0;
while (i < str.Length) {
    if (str[i].Length == 1) {
        var sb = new StringBuilder(str[i++]);
        while (i < str.Length && str[i].Length == 1) {
            sb.Append(str[i++]);
        }
        result.Add(sb.ToString());
    } else {
        result.Add(str[i++]);
    }
}
于 2013-03-03T15:52:57.580 に答える
0

このようなものが動作するはずです:

    private string[] GetCombined(string[] str)
    {
        var combined = new List<string>();
        var temp = new StringBuilder();
        foreach (var s in str)
        {
            if (s.Length > 1)
            {
                if (temp.Length > 0)
                {
                    combined.Add(temp.ToString());
                    temp = new StringBuilder();
                }
                combined.Add(s);
            }
            else
            {
                temp.Append(s);
            }
        }

        if (temp.Length > 0)
        {
            combined.Add(temp.ToString());
            temp = new StringBuilder();
        }

        return combined.ToArray();
    }
于 2013-03-03T15:33:58.367 に答える
0

これはLINQPadで使用される私の答えです:)

void Main()
{
    string[] str = { "one", "two", "three","f","o","u","r","five" };
    string[] newStr = Algorithm(str).ToArray();
    newStr.Dump();
}

public static IEnumerable<string> Algorithm(string[] str)
{

       string text = null;
       foreach(var item in str)
       {
        if(item.Length > 1)
        {
            if(text != null)
            {
                yield return text;
                text = null;
            }
            yield return item;
        }
        else
            text += item;
        }

        if(text != null)
            yield return text;
}

出力:

ワン
ツー
スリー
フォー
ファイブ

于 2013-03-03T15:35:14.337 に答える