0

我正在编写一个接受用户输入的 UI 应用程序 -

最多 50,000 个条目,他粘贴到 aTextbox中,我需要将其转换为List<Uint32>(不同)

在此过程中,我在“文本框”中显示 Disistict 列表(输出)。

我正在拆分文本并将其转换为 Uint32 的不同列表然后我将列表转换为数组。

private List<UInt32> ConvertTextToList(string TextBoxText)
{
string[] TextBoxSplitted = TextBoxText.Split(new string[] { Environment.NewLine},StringSplitOptions.RemoveEmptyEntries); //Fast
            var TextBoxSplittedAsList = TextBoxSplitted.ToList<string>(); //Fast
            List<UInt32> lp = TextBoxSplittedAsList.ConvertAll(new Converter<string, UInt32>(element => Convert.ToUInt32(element))); //Fast
            List<UInt32> uintList = lp.Distinct<UInt32>().ToList<UInt32>(); //Fast
            UInt32[] uintListArray = uintList.ToArray(); //Fast

            //Slow part (measured 15 sec on core2duo 2.53GHz)
            StringBuilder builder = new StringBuilder();
            Array.ForEach(uintListArray, x => builder.Append(x));                
            //Done slow part

            SomeTextBox.text = builder.ToString();

            return uintList;
}

首先我尝试了 -ListOfHeliostatsText.Text = string.Join(",", uintListArray);

哪个更慢(比 using 慢约 25% StringBuilder

我感觉我的函数设计错了,两次多次转换。

有没有办法提高这个功能的性能?

编辑: 我的错,慢的部分是 ListOfHeliostatsText.Text = builder.ToString();

我将继续阅读答案。

4

3 回答 3

1

你测量不正确。缓慢的部分不是

StringBuilder builder = new StringBuilder();
Array.ForEach(uintListArray, x => builder.Append(x)); 

缓慢的部分是:

SomeTextBox.Text = builder.ToString();

问题是您正在向文本框输入一大行。如果您将每个字符串放在自己的行中......

Array.ForEach(uintListArray, x => builder.AppendLine(x.ToString()));

...您将观察到大约 50 倍的加速。

于 2013-01-13T09:58:14.380 回答
0

你能试试这个吗:

private List<UInt32> ConvertTextToList(string TextBoxText)
{
   ....
    var TextBoxSplittedAsList = TextBoxSplitted.ToList<string>(); //Fast

    TextBoxSplittedAsList.Select(int.Parse).ToList();
    TextBoxSplittedAsList.Distinct().ToList(); // to get the distinct values
于 2013-01-13T09:05:57.910 回答
0

由于可能有这么多条目,我认为使用字符串拆分操作将中间值放入中间数组不会有帮助。这是很多开销。如果速度和效率是您的目标,您应该通过在读取项目时有效地阅读生成项目的字符串来对其进行标记。这样,您将不需要也不需要保存所有这些值的中间数组。

如果要获取所有不同的值,可以将所有内容放入HashSet<T>. 但是,我将在这里展示的示例将使用一些 LINQ 和Distinct()方法(它有自己的开销)。

// a naive tokenizing iterator
IEnumerable<string> Tokenize(string str, string separator)
{
    var current = 0;
    while (current < str.Length)
    {
        // we're effectively scanning through the string
        var next = str.IndexOf(separator, current);
        if (next == -1)
        {
            next = str.Length;
        }
        var token = str.Substring(current, next - current);
        yield return token;
        current = next + 1;
    }
}

List<uint> ConvertTextToList(string text)
{
    return Tokenize(text, ",")
        .Select(token => Convert.ToUInt32(token))
        .Distinct()
        .ToList();
}

并接受我的建议,不要让该方法做任何事情,而不仅仅是生成该列表。您可以在该函数之外填充该文本框,它不属于那里。

于 2013-01-13T09:28:14.990 回答