搜索列表对象

发布于 2024-07-29 03:31:29 字数 326 浏览 3 评论 0原文

我有一个清单:

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

I have a list:

Dim list As New List(Of String)

with the following items:

290-7-11

1255-7-12

222-7-11

290-7-13

What's an easy and fast way to search if duplicate of "first block" plus "-" plus "second block" is already in the list. Example the item 290-7 appears twice, 290-7-11 and 290-7-13.

I am using .net 2.0

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

时光沙漏 2024-08-05 03:31:29

如果您只想知道是否有重复但不关心它们是什么...

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

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 而不是 HashSet

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");

If you only want to know if there are duplicates but don't care what they are...

The easiest way (assuming exactly two dashes).

Boolean hasDuplicatePrefixes = list
    .GroupBy(i => i.Substring(0, i.LastIndexOf('-')))
    .Any(g => g.Count() > 1)

The fastest way (at least for large sets of strings).

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

If there are cases with more than two dashes, use the following. This will still fail with a single dash.

String prefix = item.Substring(0, item.IndexOf('-', item.IndexOf('-') + 1));

In .NET 2.0 use Dictionary<TKey, TValue> instead of 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);
    }
}

If you don't care about readability and speed, use an array instead of a list, and you are a real fan of regular expressions, you can do the following, too.

Boolean hasDuplicatePrefixes = Regex.IsMatch(
    String.Join("#", list), @".*(?:^|#)([0-9]+-[0-9]+-).*#\1");
前事休说 2024-08-05 03:31:29

您想阻止用户添加它吗?
如果是这样,则可以使用将键作为第一个块第二个块的哈希表。

如果没有,LINQ 是不错的选择。
但是,它必须遍历列表进行检查。
这个列表可以有多大?

编辑:我不知道 HashTable 是否有通用版本。
您还可以使用可以接受通用参数的 SortedDictionary。

Do you want to stop user from adding it?
If so, a HashTable with the key as first block-second block could be of use.

If not, LINQ is the way to go.
But, it will have to traverse the list to check.
How big can this list be?

EDIT: I don't know if HashTable has generic version.
You could also use SortedDictionary which can take generic arguments.

一绘本一梦想 2024-08-05 03:31:29

如果您的列表仅包含字符串,那么您可以简单地创建一个方法来获取您想要与列表一起查找的字符串:

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

如果您的数字在程序中具有特殊意义,请不要害怕使用类来表示它们而不是坚持使用字符串。 然后您将有一个地方可以为所述数字编写您想要的所有自定义功能。

If you're list contains only strings, then you can simply make a method that takes the string you want to find along with the list:

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

If you're numbers have a special significance in your program, don't be afraid to use a class to represent them instead of sticking with strings. Then you would have a place to write all the custom functionality you want for said numbers.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文