避免在列表中添加重复元素
本文关键字:元素 添加 列表 | 更新日期: 2023-09-27 17:54:55
string[] lines3 = new string[100];
List<string> lines2 = new List<string>();
lines3 = Regex.Split(s1, @"'s*,'s*");
if (!lines2.Contains(lines3.ToString()))
{
lines2.AddRange(lines3.Distinct().ToArray());
}
我已经检查了所有的空格等,但我仍然得到重复的值在我的行2 List
我必须删除这里的重复值
您可以使用Enumerable。除了从lines3中获取不属于lines2的不同项目:
lines2.AddRange(lines3.Except(lines2));
如果lines2包含了lines3中的所有条目,那么将不添加任何内容。顺便说一句,Except内部使用Set<string>
从第二个序列中获取不同的项,并验证第一个序列中存在的那些项。这是非常快的
你的这张支票:
if (!lines2.Contains(lines3.ToString()))
是无效的。你正在检查你的lines2
是否含有System.String[]
,因为lines3.ToString()
会给你。您需要检查lines3
中的item是否存在于lines2
中。
您可以迭代lines3
中的每个项目,检查它是否存在于lines2
中,然后添加它。喜欢的东西。
foreach (string str in lines3)
{
if (!lines2.Contains(str))
lines2.Add(str);
}
或者如果lines2
是任何空列表,那么您可以简单地将lines3
不同的值添加到列表中,如:
lines2.AddRange(lines3.Distinct());
则lines2
将包含不同的值。
使用HashSet<string>
代替List<string>
。它准备执行更好的性能,因为您不需要为任何项目提供检查。收藏馆会帮你处理的。这就是list
和set
之间的区别。示例:
HashSet<string> set = new HashSet<string>();
set.Add("a");
set.Add("a");
set.Add("b");
set.Add("c");
set.Add("b");
set.Add("c");
set.Add("a");
set.Add("d");
set.Add("e");
set.Add("e");
var total = set.Count;
Total为5
,取值为a
、b
、c
、d
、e
。
List<T>
的实现不给你原生的。你可以这样做,但是你必须提供这个控制。例如,extension method
:
public static class CollectionExtensions
{
public static void AddItem<T>(this List<T> list, T item)
{
if (!list.Contains(item))
{
list.Add(item);
}
}
}
并使用:
var list = new List<string>();
list.AddItem(1);
list.AddItem(2);
list.AddItem(3);
list.AddItem(2);
list.AddItem(4);
list.AddItem(5);
如果您不想在列表中出现重复项,请使用HashSet
。这样,它将清楚的其他人阅读你的代码,你的意图是什么,你将有更少的代码编写,因为HashSet
已经处理你正在尝试做什么。
您可以使用简单的Union
+ Distinct
:
var lines = lines2.Union(lines3).Distinct();
将第二个列表中的所有项添加到第一个列表中,然后返回组合列表中的所有唯一字符串。在处理大列表时不太可能执行得很好,但它很简单。
参考:http://msdn.microsoft.com/en-us/library/bb341731.aspx
如果您的检查是有效的,它要么会添加所有的项目,要么根本不添加。但是,在数组上调用ToString
方法返回数据类型的名称,而不是数组的内容,并且Contains
方法只能查找单个项,而不是项的集合。
你必须检查数组中的每个字符串:
string[] lines3;
List<string> lines2 = new List<string>();
lines3 = Regex.Split(s1, @"'s*,'s*");
foreach (string s in lines3) {
if (!lines2.Contains(s)) {
lines2.Add(s);
}
}
但是,如果您从一个空列表开始,您可以使用Distinct
方法来删除重复的列表,并且您只需要一行代码:
List<string> lines2 = Regex.Split(s1, @"'s*,'s*").Distinct().ToList();
如果您想将不同的值保存到集合中,您可以尝试HashSet class。它将自动删除重复的值,并节省您的编码时间。:)
用HashSet
比较好
请看这里:http://www.dotnetperls.com/hashset
使用HashSet
和List
:
List<string> myList = new List<string>();
HashSet<string> myHashSet = new HashSet<string>();
public void addToList(string s) {
if (myHashSet.Add(s)) {
myList.Add(s);
}
}
如果s
不存在, myHashSet.Add(s)
将返回true
根据#Felipe Oriani的提示,我制作了这个扩展,我想在这里分享一下。
public static class CollectionExtension
{
public static void AddUniqueItem<T>(this List<T> list, T item, bool throwException)
{
if (!list.Contains(item))
{
list.Add(item);
}
else if(throwException)
{
throw new InvalidOperationException("Item already exists in the list");
}
}
public static bool IsUnique<T>(this List<T> list, IEqualityComparer<T> comparer)
{
return list.Count == list.Distinct(comparer).Count();
}
public static bool IsUnique<T>(this List<T> list)
{
return list.Count == list.Distinct().Count();
}
}
不是一个好方法,但是一种快速修复,使用bool值检查整个列表中是否有重复条目。
bool containsKey;
string newKey;
public void addKey(string newKey)
{
foreach (string key in MyKeys)
{
if (key == newKey)
{
containsKey = true;
}
}
if (!containsKey)
{
MyKeys.add(newKey);
}
else
{
containsKey = false;
}
}