Suppose that we have a list of strings like
\"A\", \"B\", \"C\", \"D\", \"E\", \"F\"
Now I\'d like to search for a sub-list of
You could rewrite your approach as follows:
bool hasSublist = list
.SkipWhile(x => x != "D")
.Take(2)
.SequenceEquals(new[] {"D", "E"});
If you need the starting index of {"D", "E"}
, you could add a select that pairs up letters and their indexes.
However, the problem with your approach is that it would miss the subsequence if there's another "D"
not followed by an "E"
, for example
"D" "A" "D" "B" "D" "C" "D" "D" "D" "E"
There is a "D" "E"
at the end, but your approach stops after finding the first "D"
.
If you are looking for sublists of length 2, you could use Zip
, like this:
bool hasSublist = list
.Zip(list.Skip(1), (a, b) => new {a, b})
.Any(p => p.a == "D" && p.b == "E");
However, this does not scale for longer sub-lists.
Using a plain for
loop would work much better:
for (var i = 0 ; i < list.Count-1 ; i++) {
if (list[i] == "D" && list[i+1] == "E") {
...
}
}
The if
inside could be replaced with SequenceEquals
, accommodating sub-lists of any length:
var desiredSublist = new[] {"D", "E", "F"};
for (var i = 0 ; i < list.Count-desiredSublist+1 ; i++) {
if (list.Skip(i).SequenceEquals(desiredSublist)) {
...
}
}