假设我有一系列词汇如下:
{“你好”,“世界”,“我的”,“你好”,“世界”,“山姆”,“世界”}
我想删除任何倍数,以便解析后结果如下所示。
{“你好”,“世界”,“我的”,“山姆”}
我怎样才能以最优化的方式做到这一点。
答案 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();