.NET是否具有Python的issubset方法的等价物?

时间:2012-05-19 05:13:45

标签: .net python set

更新

正如@Blender在Python set('aab').issubset(set('abb')) == True中指出的那样。对于我的情况,这需要返回false。需要考虑每个角色的数量。


基本上我有两个字符串,我想确定一个是否是另一个的子集。例如:

String A: abcd
String B: dbace
String A is a subset of string B

字符可以是任何顺序,并且可以有重复的字符数。我曾尝试对字符串进行排序,然后使用String.StartsWith,但这在某些情况下不起作用。例如:

String A: abcdd
string B: abbcdd
Ordering these and using StartsWith returns false because string B has two "b"s

我做了一些环顾四周,发现了Python的issubset方法似乎做了我想做的事情,所以我很好奇是否有人在.NET中遇到它的等价物(或者是某人自己提出的有效方法)

注意:我正在寻找子集,而不是字谜。

2 个答案:

答案 0 :(得分:6)

我知道没有内置的内容可以按照你的意愿行事。严格来说,这不是一个真正的子集,因为它应该在Python中进行集合比较(其中集合中的每个项目都是唯一的)但是应该很容易做出一个。

public static bool IsSubsetOf<TSource>(this IEnumerable<TSource> lhs, IEnumerable<TSource> rhs)
{
    // O(m+n)
    var contents = rhs.ToList();
    foreach (var item in lhs)
    {
        if (!contents.Remove(item))
            return false;
    }
    return true;
}
"aab".IsSubsetOf("abb");      // false
"foo".IsSubsetOf("food");     // true
"foo".IsSubsetOf("goof");     // true
"bar".IsSubsetOf("barf");     // true
"abcd".IsSubsetOf("dbace");   // true
"abcdd".IsSubsetOf("abbcdd"); // true

如果你想要真正的设定机制,那就简单了。

public static bool IsTrueSubsetOf<TSource>(this IEnumerable<TSource> lhs, IEnumerable<TSource> rhs)
{
    return new HashSet<TSource>(lhs).IsSubsetOf(rhs);
}

答案 1 :(得分:-1)

我认为最好的解决方案是对它们进行排序并通过Contains方法检查子集。

new String(A.OrderBy(o=> o)).Contains(new String(B.OrderBy(o=>o)))

<强>更新

new String(A.OrderBy(o=> o)
            .Distinct())
     .Contains(new String(B.OrderBy(o=>o)
                           .Distinct()))