2012-03-29 48 views
0

列表是否有一个属性或机制,通过它我可以防止将重复条目添加到该列表中,还是每次都必须在列表中搜索它?可以通知一个字符串列表来检查重复吗?

督察,这将是更加美好只是去:

List<String> AAppsToDisplay = new List<String>(); 
AAppsToDisplay.DuplicatesAllowed = false; 
... 
while (odr.Read()) 
{ 
    AAppsToDisplay.Add(odr.GetString(0)); 
} 

,而不是必须这样做:

List<String> AAppsToDisplay = new List<String>(); 
. . . 
String s = String.Empty; 
while (odr.Read()) 
{ 
    s = odr.GetString(0); 
    if (! AAppsToDisplay.Contains(s)) 
    { 
    AAppsToDisplay.Add(s); 
    } 
} 
+5

你需要同时*排序*和*被重复免费的*? – 2012-03-29 23:15:04

+0

在这里你去克莱:http://stackoverflow.com/questions/918742/efficient-list-of-unique-strings-c-sharp无论我还是有兴趣在埃里克的建议 – 2012-03-29 23:17:09

+0

只是澄清埃里克的评论:排序指的是以添加顺序存储的项目,而不是(基本上)任意的顺序。如果您不需要订购该清单,请使用'HashSet '。 – 2012-03-29 23:18:25

回答

15

使用作业代替,HashSet<string>一个更合适的工具。

var hashset = new HashSet<string>(); 

// in loop 
hashset.Add(value); 

如果你对HashSet的使用Contains,这将是比使用它List<string>,特别是如果集从小就特别大的更优化的解决方案。但是,如果您的业务需求允许默默丢弃重复项,那么您不需要。 Add方法返回一个布尔值,指示是否添加了该值。重复从未进入集合。


需要注意的是HashSet<T>未记录保留插入顺序很重要。您可能会在以相同的插入顺序观察结果,并且可能会受到您的特定用法的影响,但您不应该依赖它。

1

你可以使用一个扩展方法来List类:

public static class StringListExtensions { 
    public static bool AddIfNotPresent(this List<string> list, string newString) { 
     if (!list.Contains(newString)) { 
      this.Add(newString); 
      return true; 
     } 
     return false; 
    } 
} 
+0

你为什么不喜欢HashSet? – 2012-03-29 23:17:43

+0

我知道HashSet比较好,但是如果你在很多地方使用过这个类,或者它在第三方DLL等等时,扩展可能适合。 – 2012-03-29 23:20:48

+1

令人惊讶的是,有多少种不同的方式来为一只猫皮肤,但现在我' m渴望腌牛肉哈希。 – 2012-03-29 23:42:46

1

你可以使用System.Linq的图书馆去

List<String> AAppsToDisplay = new List<String>(); 
... 
while (odr.Read()) 
{ 
    AAppsToDisplay.Add(odr.GetString(0)); 
} 

//new code 
AAppsToDisplay = AAppsToDisplay.Distinct().ToList(); 
+0

我从来没有听说过,只是从上面复制并粘贴抱歉 - 已将其删除 – 2012-03-29 23:25:29

相关问题