[英]Does .NET have an equivalent for Python's issubset method?
更新:
正如@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中的等效方法(或者有人自己提出了一种有效的方法)。
注意:我在寻找子集,而不是字谜。
据我所知,没有内置函数可以像您期望的那样运行。 严格来说,这不是真正的子集,因为它应该像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);
}
我认为最好的解决方案是对它们进行排序,并通过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()))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.