VS2008 C#:删除多次出现的最佳方式

时间:2009-12-16 17:57:55

标签: c#

假设我有一系列词汇如下:

{“你好”,“世界”,“我的”,“你好”,“世界”,“山姆”,“世界”}

我想删除任何倍数,以便解析后结果如下所示。

{“你好”,“世界”,“我的”,“山姆”}

我怎样才能以最优化的方式做到这一点。

5 个答案:

答案 0 :(得分:8)

我不知道最优化,但System.Linq.Enumerable.Distinct肯定是最简洁的方式。

// using System.Linq;
string[] words = {"hello", "world", "my", "hello", "world", "sam", "world"};
var uniqueWords = words.Distinct();

答案 1 :(得分:3)

如果您使用的是.NET 3.5,则可以将它们插入HashSet<T>,然后(如果您希望维护订单)浏览原始列表并添加hashset中的项目。这将是O(n),就像在单次传递中一样

string[] values = new[] {"hello", "world", "my", "hello", "world", "sam", "world"};

HashSet<string> hashSet = new HashSet<string>();
List<string> newValues = new List<string>();  // or LinkedList<string>, if you don't want the cost of backing array resizes

foreach (string val in values) {
    if (!hashSet.Contains(val)) {
        newValues.Add(val);
        hashSet.Add(val);
    }
}

// newValues is the result you want

如果是.NET 2.0,使用Dictionary<string, object>代替HashSet<T>获得相同的效果,null为值

答案 2 :(得分:2)

HashSet的构造函数会为您过滤列表。

var distinctItems = new HashSet<string>((IEnumerable<string>)myItems);

答案 3 :(得分:0)

这肯定有更有效的方式,我只是一个Linq粉丝;)

IEnumerable<string> reducedList =
    originalList.GroupBy(s => s).Select(s => s.First());

答案 4 :(得分:0)

List<string> myStrings = new List<string>(){"hello", "world", "my", "hello", "world", "sam", "world"};

var b = ((from a in my myStrings select a).Distinct()).ToList();