需要Linq查询帮助 - 确定精确子集

时间:2010-07-13 20:35:23

标签: linq

说我有以下字符串列表:

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中,它们的顺序也不相同

这样的查询可能吗?

3 个答案:

答案 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中的值,则无效。根据以下评论。