我有一个清单:
Dim list As New List(Of String)
包含以下内容:
290-7-11
1255年7月12日
222-7-11
290-7-13
如果列表中已存在“第一个块”加“ - ”加“第二个块”的副本,那么搜索是一种简单快捷的方法。示例项目290-7出现两次,290-7-11和290-7-13。
我正在使用.net 2.0
答案 0 :(得分:4)
如果您只想知道是否有重复但不关心它们是什么......
最简单的方法(假设只有两个破折号)。
Boolean hasDuplicatePrefixes = list
.GroupBy(i => i.Substring(0, i.LastIndexOf('-')))
.Any(g => g.Count() > 1)
最快的方式(至少对于大型字符串集)。
HashSet<String> hashSet = new HashSet<String>();
Boolean hasDuplicatePrefixes = false;
foreach (String item in list)
{
String prefix = item.Substring(0, item.LastIndexOf('-'));
if (hashSet.Contains(prefix))
{
hasDuplicatePrefixes = true;
break;
}
else
{
hashSet.Add(prefix);
}
}
如果有两个以上破折号的情况,请使用以下内容。单手冲刺仍然会失败。
String prefix = item.Substring(0, item.IndexOf('-', item.IndexOf('-') + 1));
在.NET 2.0中使用Dictionary<TKey, TValue>
而不是HashSet<T>
。
Dictionary<String, Boolean> dictionary= new Dictionary<String, Boolean>();
Boolean hasDuplicatePrefixes = false;
foreach (String item in list)
{
String prefix = item.Substring(0, item.LastIndexOf('-'));
if (dictionary.ContainsKey(prefix))
{
hasDuplicatePrefixes = true;
break;
}
else
{
dictionary.Add(prefix, true);
}
}
如果您不关心可读性和速度,请使用数组而不是列表,并且您真正喜欢正则表达式,您也可以执行以下操作。
Boolean hasDuplicatePrefixes = Regex.IsMatch(
String.Join("#", list), @".*(?:^|#)([0-9]+-[0-9]+-).*#\1");
答案 1 :(得分:0)
您想阻止用户添加它吗? 如果是这样的话,可以使用带有键作为第一个块第二块的HashTable。
如果没有,LINQ就是你要走的路 但是,它必须遍历清单以进行检查 这个名单有多大?
编辑:我不知道HashTable是否具有通用版本 您也可以使用SortedDictionary,它可以使用泛型参数。
答案 2 :(得分:0)
如果你的列表只包含字符串,那么你可以简单地创建一个方法来获取你想要找到的字符串以及列表:
Boolean isStringDuplicated(String find, List<String> list)
{
if (list == null)
throw new System.ArgumentNullException("Given list is null.");
int count = 0;
foreach (String s in list)
{
if (s.Contains(find))
count += 1;
if (count == 2)
return true;
}
return false;
}
如果您的数字在您的程序中具有特殊意义,请不要害怕使用类来表示它们而不是坚持使用字符串。然后,您就可以为所述数字编写所需的所有自定义功能。