-3

文字列が特定のポイントを超えることができない状況があるので、それを「x」文字の小さな文字列に切り取り、それらを 1 つずつ重ねて印刷します。x が 5 で、11 文字の文字列がある場合、すべてが等しい必要はありません。5、5、および 1 文字で 3 行を印刷しても問題ありません。C#でこれを行う簡単な方法はありますか?

例:

string Test = "This is a test string";
stringarray = Cutup(Test, 5); 
//Result:
//"This "
//"is a "
//"test "
//"strin"
//"g"
4

10 に答える 10

2

このようなことを試してください:

    public string[] Cutcup(string s, int l)
    {
        List<string> result = new List<string>();

        for (int i = 0; i < s.Length; i += l)
        {
            result.Add(s.Substring(i, Math.Min(5, s.Substring(i).Length)));
        }

        return result.ToArray();
    }
于 2013-10-24T18:51:54.007 に答える
0

すべて一行で

        var size = 5;

        var results = Enumerable.Range(0, (int)Math.Ceiling(test.Length / (double)size))
                                .Select(i => test.Substring(i * size, Math.Min(size, test.Length - i * size)));
于 2013-10-24T19:22:02.343 に答える
0
        List<string> result = new List<string>();
        string testString = "This is a test string";
        string chunkBuilder = "";
        int chunkSize = 5;
        for (int i = 0; i <= testString.Length-1; i++)
        {
            chunkBuilder += testString[i];

            if (chunkBuilder.Length == chunkSize || i == testString.Length - 1)
            {
                result.Add(chunkBuilder);
                chunkBuilder = "";
            }
        }
于 2013-10-24T19:01:50.900 に答える
0

これはかなりLINQyのワンライナーです:

static IEnumerable<string> SliceAndDice1( string s , int n )
{
  if ( s == null ) throw new ArgumentNullException("s");
  if ( n < 1 ) throw new ArgumentOutOfRangeException("n");

  int i = 0 ;
  return s.GroupBy( c => i++ / n ).Select( g => g.Aggregate(new StringBuilder() , (sb,c)=>sb.Append(c)).ToString() ) ;
}

それが頭を悩ませる場合は、より簡単な方法を試してください

static IEnumerable<string> SliceAndDice2( string s , int n )
{
  if ( s == null ) throw new ArgumentNullException("s") ;
  if ( n < 1 ) throw new ArgumentOutOfRangeException("n") ;

  int i = 0 ;
  for ( i = 0 ; i < s.Length-n ; i+=n )
  {
    yield return s.Substring(i,n) ;
  }
  yield return s.Substring(i) ;

}
于 2013-10-24T19:57:43.247 に答える
0

さらにいくつかの方法があります。 Cutup2以下はより効率的ですが、きれいではありません。両方とも、指定されたテスト ケースに合格します。

private static IEnumerable<string> Cutup(string given, int chunkSize)
{
    var skip = 0;
    var iterations = 0;
    while (iterations * chunkSize < given.Length)
    {
        iterations++;                
        yield return new string(given.Skip(skip).Take(chunkSize).ToArray());
        skip += chunkSize;
    }
}

private static unsafe IEnumerable<string> Cutup2(string given, int chunkSize)
{
    var pieces = new List<string>();
    var consumed = 0;

    while (consumed < given.Length)
    {
        fixed (char* g = given)
        {
            var toTake = consumed + chunkSize > given.Length 
                         ? given.Length - consumed 
                         : chunkSize;

            pieces.Add(new string(g, consumed, toTake));
        }

        consumed += chunkSize;
    }

    return pieces;
}
于 2013-10-24T19:18:36.623 に答える
0

私はかつてこれに使用できる拡張メソッドを作成しました:

    public static IEnumerable<IEnumerable<T>> Subsequencise<T>(this IEnumerable<T> input, int subsequenceLength)
    {
        var enumerator = input.GetEnumerator();
        SubsequenciseParameter parameter = new SubsequenciseParameter { Next = enumerator.MoveNext() };
        while (parameter.Next)
            yield return getSubSequence(enumerator, subsequenceLength, parameter);

    }


    private static IEnumerable<T> getSubSequence<T>(IEnumerator<T> enumerator, int subsequenceLength, SubsequenciseParameter parameter)
    {
        do
        {
            yield return enumerator.Current;
        } while ((parameter.Next = enumerator.MoveNext()) && --subsequenceLength > 0);
    } 

    // Needed to let the Subsequencisemethod know when to stop, since you cant use out or ref parameters in an yield-return method.
    class SubsequenciseParameter
    {
        public bool Next { get; set; }
    }

次に、これを行うことができます:

string Test = "This is a test string";
stringarray = Test.Subsequencise(5).Select(subsequence => new String(subsequence.Toarray())).Toarray();
于 2013-10-24T19:20:44.353 に答える