時IEnumerable<Object> a
系列で6つのアイテムが入っています。IEnumerable<Object> b
時系列で3項目のリストがあるかどうかをテストしたいと思います。
IEnumerable<Object> a
アイテムの値:a、b、c、d、f、g
IEnumerable<Object> b
アイテムの値:b、d、f
LINQで実行することは可能ですか?
以下を使用できます。
bool AContainsEverythingInBInTheSameOrder =
a.Intersect(b).SequenceEquals(b);
a.Intersect(b)
a
との両方にあるすべてのものをb
、に表示されるのと同じ順序でa
返します。
ローリングとティムのワンライナーアプローチは非常に優れていますが、1つの小さな落とし穴b
があります。2回繰り返されます。
それが問題になる場合は、イテレータベースのアプローチを使用できます。これは、拡張メソッドとして作成できます。
public static bool IsContainedWithinInOrder<T>(this IEnumerable<T> values,
IEnumerable<T> reference)
{
using(var iterator = reference.GetEnumerator())
{
foreach(var item in values)
{
do
{
if(!iterator.MoveNext())
return false;
} while(!Equals(iterator.Current, item));
}
return true;
}
}
これにより、両方のシーケンスが1回だけ繰り返され、全体的に軽量になります。あなたはそれをこのように呼ぶでしょう:
b.IsContainedWithinInOrder(a);
メソッドの名前はご容赦ください...
2つのリストがあり、2番目のリストアイテムが最初のリストの同じアイテムと同じ順序であるかどうかを確認したいとします。
多分:
var allSameOrder = list1.Intersect(list2).SequenceEqual(list2);