1

わかりました、ここに私が抱えている問題があります: C# を使用して、特定の文字数を出力して文字列をフォーマットし、特定の数の文字をスキップしてから、再度出力してスキップしたいと考えています。

例: 次の 2 文字をスキップして 3 文字を印刷したい。

だからこれ:
ABCDEFGHIJKL

これは次のようになります: ABCFGHKL

2、3、4などの文字ごとにスキップできるようにしただけで、これにさらにアプローチする方法が思いつきませんでした。

ここに私が持っているものがあります

string text;
    int print = 3;
    int skip = 2;

    StreamReader file = new StreamReader(@"c:\test.txt");

    while ((text = file.Readtext()) != null)
    {
            string[] stringArray = new string[text.Length];
            char ch;

            for (int i = 0; i < text.Length; i++)
            {
                ch = text[i];
                stringArray[i] = ch.ToString();
            }

            for (int i = 0; i < stringArray.Length; i+=skip)
            {
                Console.Write(stringArray[i]);
            }
}

ありがとう。


さまざまな素晴らしいソリューションをありがとうございました。本当にありがとうございました! ありがとう!

4

5 に答える 5

2
int take = 3;
int skip = 2;
string s = "ABCDEFGHIJKL";

var newstr = String.Join("", s.Where((c,i) => i % (skip + take) < take));

編集

これが私のテスト結果です....

int take = 3;
int skip = 2;

string s = String.Join("",Enumerable.Repeat("0123456789", 200));

var t1 = Measure(10000, () => { var newstr = String.Join("", s.Where((c, i) => i % (skip + take) < take)); });
var t2 = Measure(10000, () => { var newstr = new string(s.Where((c, i) => i % (skip + take) < take).ToArray()); });
var t3 = Measure(10000, () => { var newstr = GetString(s, take, skip); });


long Measure(int n,Action action)
{
    action(); //JIT???
    var sw = Stopwatch.StartNew();
    for (int i = 0; i < n; i++)
    {
        action();
    }
    return sw.ElapsedMilliseconds;
}

出力:

1665 ms. (String.Join)
1154 ms. (new string())
7457 ms. (Sayse's GetString)

編集2

Sayse の回答を以下のように変更すると、テストしたコードの中で最速の結果が得られます。( 311ミリ秒)

 public string GetString(string s, int substringLen, int skipCount)
{
    StringBuilder newString = new StringBuilder(s.Length);
    for (int i = 0; i < s.Length; i += skipCount)
    {
        for (int j = 0; j < substringLen && i < s.Length; j++)
        {
            newString.Append(s[i++]);
        }
    }
    return newString.ToString();
}
于 2013-06-02T11:18:48.877 に答える
0

やり方はこれ。ラムダ式に慣れていない場合は、これがより明確になると思います

        int print = 3;
        int skip = 2;
        string str = "ABCDEFGHILKL";

        StringBuilder stringBuilder = new StringBuilder();
        string res = String.Empty;
        int i = 0;
        while (i < str.Length)
        {
            stringBuilder.Append(str.Substring(i, Math.Min(print, str.Length - i)));
            i += print + skip;
        }

        Console.WriteLine(stringBuilder.ToString());
于 2013-06-02T11:21:05.843 に答える
0

非常に多くの見栄えの良い回答の中で、私のものはそれほど洗練されていないかもしれませんが、とにかく投稿すると思いました. シンプルなロジック。

var take = 3;
var skip = 2;

StringBuilder source = new StringBuilder("ABCDEFGHIJKL");            
StringBuilder result = new StringBuilder();

while (source.Length > 0)
{
    if (source.Length >= take)
    {
        result.Append(source.ToString().Substring(0, take));
    }
    else
    {
        result.Append(source.ToString());
    }
    if (source.Length > skip + take)
    {
        source.Remove(0, skip + take);
    }
    else
        source.Clear();
}
于 2013-06-02T11:39:52.507 に答える
0
  int print = 3;
  int skip = 2;

  Boolean isPrintState = true;
  int statePosition = 0;

  StringBuilder Sb = new StringBuilder();

  using (TextReader reader = new StreamReader(@"c:\test.txt")) { 
    while (true) {
      int Ch = reader.Read();

      if (Ch < 0)
        break;

      statePosition += 1;

      if ((isPrintState && (statePosition > print)) || (!isPrintState && (statePosition > skip))) {
        statePosition = 1;
        isPrintState = !isPrintState;
      }

      if (isPrintState) 
        Sb.Append((Char) Ch);
    }
  }

  Console.Write(Sb.ToString());
于 2013-06-02T11:32:25.617 に答える