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

需要Linq查询帮助-确定精确子集,linq,Linq,假设我有以下字符串列表: string[] list1 = { "one", "two", "three", "four"}; string[] list2 = { "one", "two", "three" }; string[] list3 = { "three", "two", "one" }; 我需要一个查询,该查询允许我将list2与list1进行比较,如果list2中的所有字符串都存在于list1中,则返回true,的顺序与list2的顺序相同 因此,如果我比较list2和list

假设我有以下字符串列表:

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


这样的查询可能吗?

如果我理解您所描述的内容,这应该可以做到:

list1.Intersect(list2).SequenceEquals(list2);
我们首先得到list1和list2的值,即
{“一”、“二”、“三”}


然后使用来确定这是否与列表1相同。

如果我理解您所描述的内容,则应该这样做:

list1.Intersect(list2).SequenceEquals(list2);
我们首先得到list1和list2的值,即
{“一”、“二”、“三”}


然后使用来确定这是否与列表1相同。

您基本上必须同时迭代两个列表。试试这个:

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;
}

如果你能想出一个更好的名字(可能把参数反过来)那就好了:)

你基本上必须同时迭代两个列表。试试这个:

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;
}
如果你能想出一个更好的名字(可能把参数反过来)那就好了:)

这个怎么样:

int pos = 0;
bool result = list1.Count(p => list2.Contains(p) && pos < list2.Length && list2[pos++] == p) == list2.Length;
int pos=0;
bool result=list1.Count(p=>list2.Contains(p)&&pos
我相信这在所有情况下都有效。活动内容如下:

字符串[]列表1={“一”、“二”、“四”、“三”}
字符串[]列表2={“一”、“二”、“三”}

接受的答案将返回false,即使列表2中的所有元素都在列表1中,顺序相同

编辑:如果列表1中包含重复的值,则编辑将不起作用。根据下面的评论。

这个怎么样:

int pos = 0;
bool result = list1.Count(p => list2.Contains(p) && pos < list2.Length && list2[pos++] == p) == list2.Length;
int pos=0;
bool result=list1.Count(p=>list2.Contains(p)&&pos
我相信这在所有情况下都有效。活动内容如下:

字符串[]列表1={“一”、“二”、“四”、“三”}
字符串[]列表2={“一”、“二”、“三”}

接受的答案将返回false,即使列表2中的所有元素都在列表1中,顺序相同



编辑:如果列表1中包含重复的值,则编辑将不起作用。根据下面的注释。

if
string[]list1={“一”、“二”、“四”、“三”}比较(列表1、列表2)是否仍然为真?(技术上与您描述的措辞相匹配)如果
string[]list1={“一”、“二”、“四”、“三”}比较(列表1、列表2)是否仍然为真?(技术上与你描述的措辞相符)虽然,我认为它不太符合问题的情况。。。“如果我将列表2与列表1进行比较,则为true”@Rex-这不起作用。当它应该返回true时,返回false。比较list2和list1应该返回true,因为list2与list1的项目顺序相同。将列表3与列表1进行比较应返回false,因为即使列表3包含列表1中的所有项目,它们的顺序也不相同。@Rex-实际上您非常接近。以下操作似乎有效:list2.Intersect(list1.SequenceEqual(list1.Take(list2.Count())@Randy:我怀疑如果您有重复的元素-
Intersect
仅返回不同的元素,则此操作将失败。在示例中,如果将“四”移动到第一个元素,它也会失败。。。我认为应该仍然匹配,因为list1确实按顺序包含list2的元素,只是有一个额外的元素开始?@Randy我新修改的代码确实适用于您所引用的特定示例,但它可能在某些实际场景中不起作用@Jon的回答解决了潜在的问题,而不仅仅是样本案例。尽管如此,我认为它不太符合问题中的案例。。。“如果我将列表2与列表1进行比较,则为true”@Rex-这不起作用。当它应该返回true时,返回false。比较list2和list1应该返回true,因为list2与list1的项目顺序相同。将列表3与列表1进行比较应返回false,因为即使列表3包含列表1中的所有项目,它们的顺序也不相同。@Rex-实际上您非常接近。以下操作似乎有效:list2.Intersect(list1.SequenceEqual(list1.Take(list2.Count())@Randy:我怀疑如果您有重复的元素-
Intersect
仅返回不同的元素,则此操作将失败。在示例中,如果将“四”移动到第一个元素,它也会失败。。。我认为应该仍然匹配,因为list1确实按顺序包含list2的元素,只是有一个额外的元素开始?@Randy我新修改的代码确实适用于您所引用的特定示例,但它可能在某些实际场景中不起作用@乔恩的回答解决了潜在的问题,而不仅仅是案例。我想有一天绑架你,交换我们的大脑。我试试这个,谢谢!!我想有一天绑架你,交换我们的大脑。我试试这个,谢谢!!不,这对于
string[]list1={“三”,“一”,“二”,“四”,“三”}失败;字符串[]列表2={“一”、“二”、“三”}。它变得混乱是因为“三”在列表2中,但直到最后……是的,它失败了,但这是因为“三”在列表1中重复了。@Klinger:是的,但我看不出问题中有任何东西表明这是无效的。@Jon:只是为了论证。:-)“三”、“一”、“二”、“四”、“三”可能是有效的输入,但是字符串“三”的顺序不正确:“……如果“全部”……则返回true,顺序与列表2相同。”。我想这个要求需要澄清,因为它给了不止一种解释的空间。我想到了三个问题:1)如何处理列表1中的重复条目