私は文字列を持っています"2-6,8,10-15,20-23"
以下のように、配列内の完全に入力された数値範囲に変換する必要があります。
{2,3,4,5,6,8,10,11,12,13,14,15,20,21,22,23}
それを変換する方法はありますか?
Mark Heath は、PluralSight で LINQ に関するコースを開催しており、これに非常によく対処しています。LINQ を使用すると、以下に示す例を使用してこれをすばやく行うことができます。
string value = "7-10,2,5,12,17-18";
var result = value.Split(',')
.Select(x => x.Split('-'))
.Select(p => new { First = int.Parse(p.First()), Last = int.Parse(p.Last()) })
.SelectMany(x => Enumerable.Range(x.First, x.Last - x.First + 1))
.OrderBy(z=>z);
はSplit
、文字列から配列を作成します。1 つ目Select
は、それぞれ 1 つまたは 2 つの要素を持つ配列の配列を作成します。2 つ目Select
は、配列値に基づいて開始値と終了値を示す匿名型を作成します。はメソッドをSelectMany
使用してEnumerable.Range
、各無名オブジェクトから数値の範囲を作成し、それIEnumerable
を整数のコレクションにフラット化します。最後に、OrderBy
レポートやその他の使用のために番号を並べ替えます。
string numberString = "2-6,8,10-15,20-23";
List<int> cNumberString = getValidString(numberString);
List<int> getValidString(string str)
{
List<int> lstNumber = new List<int>();
string[] cNumberArray = str.Split(',');
for (int k = 0; k < cNumberArray.Length; k++)
{
string tmpDigit = cNumberArray[k];
if (tmpDigit.Contains("-"))
{
int start = int.Parse(tmpDigit.Split('-')[0].ToString());
int end = int.Parse(tmpDigit.Split('-')[1]);
for (int j = start; j <= end; j++)
{
if (!lstNumber.Contains(j))
lstNumber.Add(j);
}
}
else
{
lstNumber.Add(int.Parse(tmpDigit));
}
}
return lstNumber;
}
入力文字列が常に適切にフォーマットされると仮定すると、次のようなことを試すことができます。
Public Function GetIntArray(input As String) As Integer()
Dim splits() = input.Split(",")
Dim result As New List(Of Integer)
For Each s In splits
If s.Contains("-") Then
Dim low As Integer = s.Split("-")(0)
Dim hi As Integer = s.Split("-")(1)
For i = low To hi
result.Add(i)
Next
Else
result.Add(s)
End If
Next
Return result.ToArray
End Function
基本的な考え方は、入力文字列をコンマ区切り記号で分割し、その文字列が単一の数値であるか範囲を持っているかを確認することです。
Array.ConvertAll メソッドを使用します。
Dim stringArray = {"123", "456", "789"}
Dim intArray = Array.ConvertAll(stringArray, Function(str) Int32.Parse(str))