您可以使用All扩展方法。
描述
确定序列的所有元素是否满足条件。
例子:
if (MasterSet.All(e => SubSet.Contains(e)) || SubSet.All(e => MasterSet.Contains(e)))
{
//do stuff
}
选择:
if (!MasterSet.Except(SubSet).Any() || !SubSet.Except(MasterSet).Any())
{
//do stuff
}
编辑:
正如Iridium 在他的评论中指出的那样,对于您不想匹配的情况,您可以通过简单地计算每个元素的出现SubSet { 100, 3, 3 } 来进行。MasterSet = { 100, 100, 3 }
if (MasterSet.All(e => MasterSet.Count(r => r==e) <= SubSet.Count(r => r==e))
|| SubSet.All(e => SubSet.Count(r => r==e) <= MasterSet.Count(r => r==e)))
{
//do stuff
}
(请注意,这可能不是最有效的方法......)
编辑2:
鉴于您基本上在序列中搜索序列,您可以使用以下方法:
void Main()
{
var MasterSet = new List<string>() {"100", "3","4"};
var SubSets = new[]
{
new List<string>() {"100", "100", "3"},
new List<string>() {"100", "3", "4"},
new List<string>() {"32", "3423", "4234", "100", "3", "4", "34234"},
new List<string>() {"100", "32", "3423", "4234", "100", "3", "4", "34234"},
new List<string>() {"100", "32", "3", "4234", "100", "4", "34234"},
new List<string>() {"100", "4", "3"},
new List<string>() {"100", "3", "3"},
new List<string>() {"100", "3"},
new List<string>() {"100", "3", "3", "1"}
};
foreach (var SubSet in SubSets)
{
if (IsMatch(MasterSet, SubSet))
Console.WriteLine(String.Join(", ", SubSet) + " is a \"subset\"");
else if (IsMatch(SubSet, MasterSet))
Console.WriteLine(String.Join(", ", SubSet) + " is a \"superset\"");
}
}
bool IsMatch<T>(IEnumerable<T> source, IEnumerable<T> to_test)
{
using (var enumerator = source.GetEnumerator())
using (var sub_enumerator = to_test.GetEnumerator())
while (sub_enumerator.MoveNext())
{
if (!enumerator.MoveNext())
return false;
if (!enumerator.Current.Equals(sub_enumerator.Current))
sub_enumerator.Reset();
}
return true;
}
输出:
100, 3, 4 是“子集”
32, 3423, 4234, 100, 3, 4, 34234 是“超集”
100, 32, 3423, 4234, 100, 3, 4, 34234 是“超集”
100, 3 是一个“子集”