2010-10-04 46 views
4

我有一個列表,我從db中選擇用戶,每次sql查詢以特定值運行並在時間中選擇一個用戶,因此我無法在sql中限制相同的用戶。如何從列表中刪除相同的項目<string>?

我有一個列表:

list[0] = "jerry" 
list[1] = "tom" 
list[2] = "jerry" 

我想任何(第一或最後沒有在我的情況關係)從列表中刪除。

感謝

回答

15

LINQ可以解決這個問題:

List<string> names = new List<string> { "Tom", "Jerry", "Tom" }; 
IQueryable<string> distinctItems = names.Distinct(); 

如果你想有一個列表類型,只需調用ToList():

distinctItems.ToList(); 

下面是來自MSDN一個例子。

編輯:非LINQ例子(使用載有()從List class):

List<string> names = new List<string> { "Tom", "Jerry", "Tom" }; 
List<string> distinctNames = new List<string>(); 
foreach (var name in names) 
{ 
    if (!distinctNames.Contains(name)) 
    { 
     distinctNames.Add(name); 
    } 
} 
+0

,沒有LINQ? – eugeneK 2010-10-04 10:26:36

+0

沒有LINQ?使用傳統的搜索和刪除方法。 – Nayan 2010-10-04 10:32:27

+1

請參閱@ lee的使用HashSet而不是LINQ的答案。 – 2010-10-04 10:33:01

22
IEnumerable<string> uniqueUsers = list.Distinct(); 

你也可以使用一個HashSet:

HashSet<string> uniqueUsers = new HashSet<string>(list); 
+0

用於HashSet解決方案。整潔的把戲。 – Scott 2010-10-04 10:37:14

+0

+1對於HashSet ...很好的答案 – eugeneK 2010-10-04 11:05:07

6

您可以使用DISTINCT( )LINQ擴展。

var list = new List<string> { "Tom", "Jerry", "Tom" }; 

var uniqueList = list.Distinct(); 
2

使用Distinct,如其他答案建議,將離開你原來的清單完整並返回一個包含從列表中的不同項目單獨IEnumerable<>序列。

另一種方法是從原來的直接列表中刪除重複項,使用RemoveAll

var temp = new HashSet<string>(); 
yourList.RemoveAll(x => !temp.Add(x));