你可以重寫你的方法如下:
bool hasSublist = list
.SkipWhile(x => x != "D")
.Take(2)
.SequenceEquals(new[] {"D", "E"});
如果需要的{"D", "E"}
開始索引,你可以添加一個選擇對了字母和它們的索引。
但是,你們的做法的問題是,它會錯過子,如果有另一個"D"
不是跟一個"E"
,例如
"D" "A" "D" "B" "D" "C" "D" "D" "D" "E"
有在最後一個"D" "E"
,但經過你的方法停止找到第一個"D"
。
如果您正在尋找長度爲2的子列表,你可以使用Zip
,像這樣:
bool hasSublist = list
.Zip(list.Skip(1), (a, b) => new {a, b})
.Any(p => p.a == "D" && p.b == "E");
但是,這不能擴展更長的子列表。
使用純for
循環將運行得更好:
for (var i = 0 ; i < list.Count-1 ; i++) {
if (list[i] == "D" && list[i+1] == "E") {
...
}
}
的if
內可以用SequenceEquals
被替換,可容納任何長度的子列表:
var desiredSublist = new[] {"D", "E", "F"};
for (var i = 0 ; i < list.Count-desiredSublist+1 ; i++) {
if (list.Skip(i).SequenceEquals(desiredSublist)) {
...
}
}
你可以使用列表,其中((X,I)=>(X = = 「d」)&&(名單[我+ 1] ==「E」))。FirstOrDefault(); – jdweng
@jdweng太棒了!爲什麼你不把它作爲答案? – Ahmad