2015-08-22 263 views
-3

我一直在编写一个程序,它有一个100,000个元素的列表,我必须处理具有不同条件的所有元素。这最多不需要太多时间3秒。在此之后,我有一个有效的条目列表和我的信号列表,其中有100000个元素。通常新的列表大小为6K - 7K。主要问题是当我使用List.Remove函数或其他任何方式从100K元素中删除无效元素时,它的速度太慢。列表花费的时间太多

请指导我是否应该使用其他任何东西,然后是LIST,或者我也可以使用此代码做些事情。

我包括我试过的所有代码。

for(int k = 0; k < initialList.Count;k++) 
{ 
    combo c = initialList.ElementAt(k); 
    if(invalidEntries.Contains(c)) 
    { 
     smartString.Append(c.number1.ToString()); 
     smartString.Append(c.number2.ToString()); 
     smartString.Append(c.number3.ToString()); 
     smartString.Append(c.number4.ToString()); 
     smartString.Append(c.number5.ToString()); 
     smartString.Append(" Sum : "); 
     smartString.Append(c.sum.ToString()); 
     smartString.AppendLine(); 
     InvalidCombo.AppendText(smartString.ToString()); 
     smartString.Clear(); 
    } 
    else 
    { 
     smartString.Append(c.number1.ToString()); 
     smartString.Append(c.number2.ToString()); 
     smartString.Append(c.number3.ToString()); 
     smartString.Append(c.number4.ToString()); 
     smartString.Append(c.number5.ToString()); 
     smartString.Append(" Sum : "); 
     smartString.Append(c.sum.ToString()); 
     smartString.AppendLine(); 

     validCombo.AppendText(smartString.ToString()); 
     smartString.Clear(); 
    } 
} 

而且

for(int k=0;k<100000;k++) 
{ 
    combo c = initialList.ElementAt(k); 
    if (!invalidEntries.Contains(c)) 
     validEntries.Add(c); 
} 

我也曾尝试卸下摆臂的功能,但我认为不能单把它。所以任何建议/解决方案?

+1

这是U/I组件还是集合?如果您试图在U/I组件中显示100K项目,也许您需要重新考虑您的设计? – OldProgrammer

+0

尝试使用StringDictionary而不是列表,并让程序在从字典中删除项目时提供字典条目的关键字。字典比列表更容易搜索。 –

+0

@OldProgrammer是它的一个UI程序,但列表是在代码中生成的。它是一个结构列表,结构有6个整数元素。在ui中显示的时间不是,但在处理部分上面给出了 –

回答

1

我是struct s的大风扇,但是当你有一个struct像你这样的工作,你必须非常小心。依赖于相等的方法(Contains,IndexOf,Remove)可能不起作用,因此不应使用。 HashSet<T>和相似。
最适合您的情况是将处理与移除相结合。并且从List<T>中删除的最快方法是不使用它删除相关项目(Remove/RemoveAt)的方法! :-)相反,通过将列表中应该保留的项目(以及它们的计数)保存在列表的开头,然后使用RemoveRange方法来删除列表末尾的不必要项目,可以“压缩”列表。这是非常有效的,并避免使用“正常”列表删除方法时发生的所有数据块移动。这是根据你的结构定义的一个示例代码:

public struct combo { public int number1; public int number2; public int number3; public int number4; public int number5; public int sum; public bool invalid; } 

void ProcessList(List<combo> list) 
{ 
    int count = 0; 
    for (int i = 0; i < list.Count; i++) 
    { 
     var item = list[i]; 
     ProcessItem(ref item); 
     if (!item.invalid) list[count++] = item; 
    } 
    list.RemoveRange(count, list.Count - count); 
} 

void ProcessItem(ref combo item) 
{ 
    // do the processing and set item.invalid=true/false 
} 

在你没有变异的ProcessItem内的项目时,你可以删除ref修改,更改返回类型bool并用它来控制是否项目应该从列表中删除或不。

0

以下是使用HashSet的示例。它非常快。

using System.Collections.Generic; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var myInts = new HashSet<int>(); 
      for (var i = 0; i < 100000; i++) 
       myInts.Add(i); 

      myInts.Remove(62345); 
     } 
    } 
} 
+0

嘿,我认为我误解了你的代码,它不是你遇到麻烦的整数,而是你正在使用的任何结构。虽然答案仍然相同,请使用HashSet 并为T指定任何结构。 –