需要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中的重复条目