2016-08-29 2 views
0

Я написал программу, которая извлекает все возможные подстроки (смежные подлодки) данной строки:Используя метод, аналогичный подстроки в списке чисел

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 


namespace Empty 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string str = Console.ReadLine(); 

      for (int i = 1; i <= str.Length; i++) 
      { 
       for (int j = 0; j <= (str.Length - i); j++) 
       { 
        string subStr = str.Substring(j, i); 
        Console.WriteLine(subStr); 
       } 
      } 

      Console.ReadLine(); 
     } 
    } 
} 

Так что, когда я вхожу abc, она возвращает:

a 
b 
c 
ab 
bc 
abc 

Теперь я хотел бы использовать эту идею, чтобы применить его к списку целых чисел, так что она возвращает все возможные конкатенации элементов этого списка чисел.

Например, если я ввожу [2 11 8], я хотел бы его вернуть:

2 
11 
8 
211 
118 
2118 

Есть ли способ, подобный Substring, что я могу использовать в списке чисел, чтобы достичь своей цели? Другими словами, могу ли я повторно использовать и модифицировать мою небольшую программу, которая работает с строкой, поэтому она также работает с целым числом?

+4

Не то, чтобы я знал. Я просто '.ToString()' lot и использовать тот же код, который вы сделали для строк. – itsme86

+1

Если ваша строковая логика вместо этого работала с вводом в виде символьного массива, вы могли бы легко адаптировать ее для любого типа массива. –

+1

Если вы берете '' abs "' и вместо этого смотрите на него как '[" a "," b "," c "]', тогда вам просто нужно сделать '[2, 11, 8]. Выбрать (x => x.ToString())' и обработать то же самое, но обязательно рассмотреть строки длины> 1. – crashmstr

ответ

2

Есть ли способ, подобные подстроки, что я могу использовать в списке чисел

Да, есть прямой эквивалент List<T> метод называется GetRange. Вы можете видеть, что, посмотрев на сигнатуры методов:

строковых: общественный строки подстроку (INT STARTINDEX, длина ИНТ)

и

Список < T >: public Список < T> GetRange (int index, int кол)

Таким образом, имея List<int> list заменить str.Length с list.Count, str.Substring(j, i) с string.Concat(list.GetRange(i, j)), и вы сделали.

3

Подход, который вы принимаете, выглядит просто замечательно. Вам просто нужно разрешить ему работать с целыми числами (преобразованными в строки).

Вы также можете сделать свой код более универсальным для любого типа.

void Main() 
{ 
    Console.WriteLine(GetAllSubstrings('a', 'b', 'c')); 
    Console.WriteLine(GetAllSubstrings(2, 11, 8)); 
} 

// Define other methods and classes here 
public IEnumerable<string> GetAllSubstrings(params object[] args) 
{ 
    for (int i = 1; i <= args.Length; i++) 
    { 
     for (int j = 0; j <= (args.Length - i); j++) 
     { 
      yield return string.Join(string.Empty, args.Skip(j).Take(i)); 
     } 
    } 
} 
+0

Спасибо Джонатан. Эта общая форма очень полезна. – Joshua