【问题标题】:What is the generic list equivalent of Strings.Contains?Strings.Contains 的通用列表等价物是什么?
【发布时间】:2014-04-01 17:59:19
【问题描述】:

我有一个在 2 个字符串中搜索最长匹配子字符串的方法。它通过循环来做到这一点:

myFirstString.contains(mySecondString.subset(i,j))

但是,如果我想在 2 个有序列表中找到最长匹配的子列表,该怎么办?换句话说,如果我的数组不是字符,而是其他对象怎么办?

什么是 List 等价于字符串的“.contains”?

myFirstList.contains(mySecondList.getRange(i,j)) 不正确,因为这里.contains 是在寻找一个项目,而不是一个列表。
.Intersection() 只检查匹配项目,而不是匹配项目的子列表。

(理想情况下,我希望这个方法能够使用 List,但 List 可以。)

【问题讨论】:

  • 编辑:澄清一下,我正在寻找一个 substring 而不是 subsequence 的等价物。如果我有 ABCA 和 ACAC,那么我希望返回“CA”作为最长匹配,而不是“A...CA”
  • 您说您正在寻找接受序列的Contains。这意味着它返回一个布尔值,指示该序列是否包含在另一个序列中。这正是您所要求的。
  • 所以...不,没有等效的 List,我应该编写自己的实现吗? (这篇文章似乎对“子序列”的定义相当困惑——我认为它不只是处理子字符串,抱歉。)
  • 这个答案对你有用吗?还是您面临任何其他问题?

标签: c#


【解决方案1】:

您可以使用Contains 的扩展版本,它首先尝试在list1 中查找list2 的第一个元素的第一个匹配项的索引。如果找到,则迭代到list2list1 内的第一个元素的最后一次出现。如果使用SequenceEqual 找到任何此类索引的匹配项,则循环返回。这是Containsgeneric & extended版本:

public static class ExtensionMethods
{
    public static bool Contains<T>(this List<T> list1, List<T> list2)
    {
        int firstIndex = list1.IndexOf(list2.First());
        int lastIndex = list1.LastIndexOf(list2.First());

        if (firstIndex == -1) return false;

        for (int i = firstIndex; i <= lastIndex; i++)
        {
            if (list1.GetRange(i, list2.Count).SequenceEqual(list2)) return true;
        }

        return false;
    }
}

顺便说一句,你必须在 T 类中实现 IEquatable&lt;T&gt;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-10
    • 2014-05-08
    • 2014-06-12
    • 1970-01-01
    • 2022-11-28
    • 2021-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多