簡體   English   中英

C#中基於任意數組的拆分字符串

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM