代码之家  ›  专栏  ›  技术社区  ›  Saif Khan

搜索列表对象

  •  0
  • Saif Khan  · 技术社区  · 15 年前

    我有一个清单:

    Dim list As New List(Of String)
    

    包括以下项目:

    290-711

    1255-712

    222-7

    290-7-13

    如果列表中已经有“第一个块”加“—”加“第二个块”的副本,那么搜索起来又方便又快捷。示例290-7项出现两次,290-7-11和290-7-13。

    我正在使用.NET 2.0

    3 回复  |  直到 15 年前
        1
  •  4
  •   Daniel Brückner Pradip    15 年前

    如果你只想知道是否有副本,但不在乎它们是什么…

    最简单的方法(假设正好有两个破折号)。

    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中的使用 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");
    
        2
  •  0
  •   shahkalpesh    15 年前

    是否要阻止用户添加它?
    如果是这样,则可以使用键为第一块第二块的哈希表。

    如果不是这样,Linq是一条必经之路。
    但是,它必须遍历列表进行检查。
    这个清单能有多大?

    编辑:我不知道哈希表是否有通用版本。
    您还可以使用SortedDictionary,它可以采用泛型参数。

        3
  •  0
  •   lillicoder    15 年前

    如果您的列表只包含字符串,那么您可以简单地创建一个方法,该方法将要查找的字符串与列表一起使用:

    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;
    }
    

    如果数字在你的程序中有特殊的意义,不要害怕用类来表示它们,而不是用字符串。然后,您将有一个地方来编写所需的所有自定义功能。