ユーザーが選択する数字を入力できるテキスト ボックスの作成に問題があります。10-16,18,22-30
(印刷するページを選択するときのように)ただし、いくつかの文字も入れています。たとえば、11,11A,12,12A
.
ユーザーが必要な数字を入力したときに配列に転送されるようにするにはどうすればよいですか?
説明が下手なので、わからなかったらごめんなさい。
入力エラーをチェックせず、文字を含む数字で範囲を定義できないと仮定すると、次のようになります。
String textInput = "11,11A,12,12A,13-16,18,22-30";
String[] strArray = textInput.Split(',');
List<String> pages = new List<String>();
foreach (String s in strArray)
{
String[] range = s.Split('-');
if (range.Length == 2)
{
int startPage = int.Parse(range[0]);
int endPage = int.Parse(range[1]);
for (int i = startPage; i<= endPage; i++)
{
pages.Add(i.ToString());
pages.Add(i.ToString()+"A");
}
}
else
{
pages.Add(s);
}
}
String[] resultArray = pages.ToArray();
Console.WriteLine("Input: " + textInput);
foreach (String s in resultArray)
{
Console.WriteLine(s);
}
アルファベットから数字部分を削除する必要があります。次に、次の linq クエリを使用できます。
var txtRange = "16,18,22-30";
var tokens = txtRange.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
.Select(t => new {
Token = t,
Range = t.Split(new[] { '-' }, StringSplitOptions.RemoveEmptyEntries)
})
.Select(x => new{ x.Token, x.Range,
RangeStart = int.Parse(x.Range[0]),
RangeEnd = x.Range.Length > 1 ? int.Parse(x.Range[1]) : int.Parse(x.Range[0])
});
int min = tokens.Min(x => x.RangeStart);
int max = tokens.Max(x => x.RangeEnd);
var list = new List<String>() { "11", "11A", "12", "12A", "13", "14", "15", "19" };
var result = list.Select(s => new
{
Str = s,
Num = int.Parse(new string(s.Where(Char.IsDigit).ToArray()))
})
.Where(x => x.Num >= min && x.Num <= max);
foreach(var x in result)
Console.WriteLine("String: {0} Numeric-Part: {1}", x.Str, x.Num);
それは機能しています(少し複雑すぎるようですが)。