说我有以下字符串列表:
string[] list1 = { "one", "two", "three", "four"};
string[] list2 = { "one", "two", "three" };
string[] list3 = { "three", "two", "one" };
我需要一个允许我将list2与list1进行比较的查询,如果list2中的所有字符串都存在于list1中,则返回true,与list2 的顺序相同。
因此,如果我将list2与list1进行比较,这样的查询将返回true,因为list2中的所有字符串都在list1中,与list2 的顺序相同。
如果我将list3与list1进行比较,则查询将返回false,因为即使list3中的字符串存在于list1中,它们的顺序也不相同。
这样的查询可能吗?
答案 0 :(得分:4)
如果我理解你所描述的内容,应该这样做:
list1.Intersect(list2).SequenceEquals(list2);
我们首先得到list1和list2的intersection,即{ "one", "two", "three" }
然后使用SequenceEquals确定它是否与list1相同。
答案 1 :(得分:2)
您基本上必须同时迭代两个列表。试试这个:
public static bool IsOrderedSubsequenceOf<T>(
this IEnumerable<T> smallerList,
IEnumerable<T> largerList)
{
IEqualityComparer<T> comparer = Comparer<T>.Default;
using (var smallerIterator = smallerList.GetEnumerator())
using (var largerIterator = largerList.GetEnumerator())
{
while (smallerIterator.MoveNext())
{
T currentTarget = smallerIterator.Current;
bool found = false;
while (largerIterator.MoveNext())
{
T candidate = largerIterator.Current;
if (comparer.Equals(currentTarget, candidate))
{
found = true;
break;
}
}
if (!found)
{
// Exhausted iterator without finding target.
return false;
}
}
}
// Found everything in the smaller sequence. Done.
return true;
}
我没有对此进行过测试,甚至没有对其进行过编译,但我认为它可能有用......
你用
打电话if (list2.IsOrderedSubsequenceOf(list1))
如果你能想出一个更好的名字(可能反过来提出反对意见)那会很好:)
答案 2 :(得分:0)
这个怎么样:
int pos = 0;
bool result = list1.Count(p => list2.Contains(p) && pos < list2.Length && list2[pos++] == p) == list2.Length;
这适用于我认为的所有情况。以下事件:
string [] list1 = {“one”,“two”,“four”,“three”};
string [] list2 = {“one”,“two”,“three”};
即使list2中的所有元素都在list1中,接受的答案也会返回false。
编辑:如果list1重复包含list2中的值,则无效。根据以下评论。