4

IEnumerable<Object> a系列で6つのアイテムが入っています。IEnumerable<Object> b時系列で3項目のリストがあるかどうかをテストしたいと思います。

IEnumerable<Object> aアイテムの値:a、b、c、d、f、g

IEnumerable<Object> bアイテムの値:b、d、f

LINQで実行することは可能ですか?

4

3 に答える 3

8

以下を使用できます。

bool AContainsEverythingInBInTheSameOrder =
    a.Intersect(b).SequenceEquals(b);

a.Intersect(b)aとの両方にあるすべてのものをbに表示されるのと同じ順序でa返します。

于 2012-12-10T13:30:25.947 に答える
7

ローリングとティムのワンライナーアプローチは非常に優れていますが、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);

メソッドの名前はご容赦ください...

于 2012-12-10T13:27:25.800 に答える
6

2つのリストがあり、2番目のリストアイテムが最初のリストの同じアイテムと同じ順序であるかどうかを確認したいとします。

多分:

var allSameOrder = list1.Intersect(list2).SequenceEqual(list2);

デモ

于 2012-12-10T13:31:46.497 に答える