[英]Split String Based On An Arbitrary Array in C#
我想基於“ tmpnumstr”成員拆分“ tmpstr”成員。 這是我的臨時解決方案,但我正在尋找任意“ tmpstr”和“ tmpnumstr”的通用解決方案。
string tmpstr = "New,Open,Exit,Copy,Cut,Paste,Help,About,";
string tmpnumstr = "3,3,2,"; // string of numbers
string[] tmpstrArray = tmpstr.TrimEnd(',').Split(',');
for (int i = 0; i < 3; i++)
{
textBox1.Text += tmpstrArray[i] + @",";
}
textBox1.Text += Environment.NewLine;
for (int i = 3; i < 6; i++)
{
textBox1.Text += tmpstrArray[i] + @",";
}
textBox1.Text += Environment.NewLine;
for (int i = 6; i < 8; i++)
{
textBox1.Text += tmpstrArray[i] + @",";
}
textBox1.Text += Environment.NewLine;
輸出為==>
新建,打開,退出,
復制,剪切,粘貼,
幫助,關於,
聽起來像您想根據動態輸入將原始字符串拆分為幾個數組?
在這種情況下,應該將第一字分割到一個平面列表,然后使用的組合.Skip()
和.Take()
以進一步分裂它的子組。
使用您現有代碼作為基礎的示例代碼:
string rawWords = "New,Open,Exit,Copy,Cut,Paste,Help,About,";
string rawGroupCounts = "3,3,2,"; // string of numbers
List<int> groupCounts = rawGroupCounts.Split(new char[] { ',' },
StringSplitOptions.RemoveEmptyEntries).
ToList().ConvertAll(rawValue => Int32.Parse(rawValue));
List<string> words = rawWords.Split(new char[] { ',' },
StringSplitOptions.RemoveEmptyEntries).ToList();
List<List<string>> wordGroups = new List<List<string>>();
if (groupCounts.Count > 0)
{
int skipCounter = 0;
groupCounts.ForEach(count =>
{
wordGroups.Add(words.Skip(skipCounter).Take(count).ToList());
skipCounter += count;
});
}
textBox1.Text = string.Join(Environment.NewLine,
wordGroups.ConvertAll(group => string.Join(", ", group)));
(我還更改了變量名稱以使其具有某些含義)
我相信這應該做到。
string tmpstr = "New,Open,Exit,Copy,Cut,Paste,Help,About,";
string tmpnumstr = "3,3,2,"; // string of numbers
string[] tmpstrArray = tmpstr.TrimEnd(',').Split(',');
int[] tmpnumstrArray = tmpnumstr.TrimEnd(',').Split(',').Select(x => int.Parse(x)).ToArray(); //To convert tmpnumstr to integer array
for(int i=1;i<tmpnumstrArray.Length;i++)
tmpnumstrArray[i] += tmpnumstrArray[i - 1];
for(int i = 0, k = 0;i < tmpnumstrArray[tmpnumstrArray.Length - 1];i++)
{
if(i == tmpnumstrArray[k])
{
textBox1.Text += Environment.NewLine;
k++;
}
textBox1.Text += tmpstrArray[i] + @",";
}
textBox1.Text += Environment.NewLine;
給定以下“糖”幫助類:
public class BatchingProcessor<T>
{
private readonly IEnumerator<T> enumerator;
public BatchingProcessor(IEnumerable<T> enumerable)
{
this.enumerator = enumerable.GetEnumerator();
}
public Batch<T> Take(int count)
{
var values = this.TakeUntilEndIsReached(count).ToArray();
return new Batch<T>(values, count);
}
private IEnumerable<T> TakeUntilEndIsReached(int count)
{
for (int i = 0; i < count; i++)
{
if (enumerator.MoveNext())
{
yield return enumerator.Current;
}
else
{
break;
}
}
}
}
public class Batch<T>
{
private readonly T[] values;
private readonly int batchSize;
public Batch(T[] values, int batchSize)
{
this.values = values;
this.batchSize = batchSize;
}
public T[] Values => this.values;
public int BatchSize => this.batchSize;
public bool EndReached => this.values.Length < this.batchSize;
}
我們可以這樣寫:
string tmpstr = "New,Open,Exit,Copy,Cut,Paste,Help,About,";
string tmpnumstr = "3,3,2,"; // string of numbers;
string[] items = tmpstr.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
int[] itemSequence = tmpnumstr
.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
.Select(x => Convert.ToInt32(x))
.ToArray();
var sb = new StringBuilder();
var batchingProcessor = new BatchingProcessor<string>(items);
foreach (int itemCount in itemSequence)
{
var batch = batchingProcessor.Take(itemCount);
foreach (string item in batch.Values)
{
sb.Append(item);
sb.Append(",");
}
sb.AppendLine();
if (batch.EndReached)
{
// tmpnumstr specifies more strings than tmpstr contains.
break;
}
}
textBox1.Text = sb.ToString();
我已經測試過它產生的字符串與原始代碼完全相同:
string expectedString = @"New,Open,Exit,
Copy,Cut,Paste,
Help,About,
";
sb.ToString().Should().Be(expectedString);
現在,如果您確定項目計數和組規格匹配,則無需檢查,可以執行以下操作:
string tmpstr = "New,Open,Exit,Copy,Cut,Paste,Help,About,";
string tmpnumstr = "3,3,2,"; // string of numbers;
string[] items = tmpstr.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
int[] itemSequence = tmpnumstr
.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
.Select(x => Convert.ToInt32(x))
.ToArray();
var batchingProcessor = new BatchingProcessor<string>(items);
var batches = itemSequence
.Select(itemCount => batchingProcessor.Take(itemCount))
.Select(batch => string.Join(",", batch.Values))
.ToArray();
textBox1.Text = string.Join("," + Environment.NewLine, batches);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.