C#
LINQ

IEnumerableで要素数がn個だったらというチェック

思いついた方法が二つあって、計算量がややこしいのでどっちが効率いいのか考えてみました。

var count = list.Count();
if(count == n)
{
//n=1の時は list.Any() && !list.Skip(n).Any()でもOK
if(list.Skip(n - 1).Any() && !list.Skip(n).Any())
{

IEnumerable#Count()は全要素を列挙してカウントします。計算量はlistの要素数が影響します(当然多いほど遅い)。Any()は最初の要素だけ列挙してBreakしてると思われるのでlistの要素数は影響しません。Skip()は引数に与えられた数だけ列挙してると思われるので引数のnが計算量に影響します。

どちらが早いかはlistの総カウントとnの両方に依存することになります。結構ややこしいですね・・・いちいちベンチ取るしかないかな。LISTのカウントとnを入れるとベンチを取ってくれるWEBツールがあるといいですね。今、手元に公開できるC#の動くサーバーが無いのでまたの機会にします。

ベンチ

試しにベンチを取って見ました。(それぞれ1000000回実行した秒数です)

要素数10 1<=n<=9

COUNT 0.08688519sec n: 1
SKIP  0.13536301sec n: 1

COUNT 0.08437488sec n: 2
SKIP  0.13601078sec n: 2

COUNT 0.08058210sec n: 3
SKIP  0.13479600sec n: 3

COUNT 0.07993681sec n: 4
SKIP  0.15452508sec n: 4

COUNT 0.08438793sec n: 5
SKIP  0.14931089sec n: 5

COUNT 0.08125596sec n: 6
SKIP  0.16214308sec n: 6

COUNT 0.07907924sec n: 7
SKIP  0.19363627sec n: 7

COUNT 0.08123375sec n: 8
SKIP  0.17400098sec n: 8

COUNT 0.08016390sec n: 9
SKIP  0.18064998sec n: 9

要素数30 1<=n<=29

COUNT 0.15943179sec n: 1
SKIP  0.13440001sec n: 1

COUNT 0.15907705sec n: 2
SKIP  0.15324895sec n: 2

COUNT 0.15385581sec n: 3
SKIP  0.15094105sec n: 3

COUNT 0.15155003sec n: 4
SKIP  0.15132929sec n: 4

COUNT 0.15053695sec n: 5
SKIP  0.15245803sec n: 5

COUNT 0.16269881sec n: 6
SKIP  0.15841695sec n: 6

COUNT 0.14897202sec n: 7
SKIP  0.16994092sec n: 7

COUNT 0.15018292sec n: 8
SKIP  0.17811006sec n: 8

COUNT 0.14989201sec n: 9
SKIP  0.17823207sec n: 9

COUNT 0.14884896sec n: 10
SKIP  0.18676723sec n: 10

COUNT 0.14831721sec n: 11
SKIP  0.19475478sec n: 11

COUNT 0.15004187sec n: 12
SKIP  0.20300291sec n: 12

COUNT 0.15208813sec n: 13
SKIP  0.20805102sec n: 13

COUNT 0.14660101sec n: 14
SKIP  0.20904329sec n: 14

COUNT 0.16910486sec n: 15
SKIP  0.22802693sec n: 15

COUNT 0.14786586sec n: 16
SKIP  0.23907205sec n: 16

COUNT 0.14849105sec n: 17
SKIP  0.26083892sec n: 17

COUNT 0.15115016sec n: 18
SKIP  0.26024299sec n: 18

COUNT 0.14975131sec n: 19
SKIP  0.25071591sec n: 19

COUNT 0.15001296sec n: 20
SKIP  0.27903481sec n: 20

COUNT 0.15756996sec n: 21
SKIP  0.26791177sec n: 21

COUNT 0.14960110sec n: 22
SKIP  0.27541517sec n: 22

COUNT 0.15017587sec n: 23
SKIP  0.28378777sec n: 23

COUNT 0.14580902sec n: 24
SKIP  0.28498104sec n: 24

COUNT 0.15334310sec n: 25
SKIP  0.28784184sec n: 25

COUNT 0.15154086sec n: 26
SKIP  0.30863619sec n: 26

COUNT 0.14755202sec n: 27
SKIP  0.31374107sec n: 27

COUNT 0.14913599sec n: 28
SKIP  0.31061932sec n: 28

COUNT 0.14858802sec n: 29
SKIP  0.32072894sec n: 29

要素数100 1<=n<=50

COUNT 0.35548280sec n: 1
SKIP  0.12780990sec n: 1

COUNT 0.34627413sec n: 2
SKIP  0.13351811sec n: 2

COUNT 0.36455394sec n: 3
SKIP  0.14014313sec n: 3

COUNT 0.35904884sec n: 4
SKIP  0.14739194sec n: 4

COUNT 0.34664227sec n: 5
SKIP  0.14899988sec n: 5

COUNT 0.34295386sec n: 6
SKIP  0.15708193sec n: 6

COUNT 0.34352898sec n: 7
SKIP  0.16527223sec n: 7

COUNT 0.34516796sec n: 8
SKIP  0.17206404sec n: 8

COUNT 0.34318306sec n: 9
SKIP  0.18129598sec n: 9

COUNT 0.34371693sec n: 10
SKIP  0.19026981sec n: 10

COUNT 0.34110578sec n: 11
SKIP  0.19495013sec n: 11

COUNT 0.34406391sec n: 12
SKIP  0.19804296sec n: 12

COUNT 0.34176800sec n: 13
SKIP  0.20717017sec n: 13

COUNT 0.34706611sec n: 14
SKIP  0.22112405sec n: 14

COUNT 0.35393021sec n: 15
SKIP  0.22262092sec n: 15

COUNT 0.34526211sec n: 16
SKIP  0.23557617sec n: 16

COUNT 0.34390805sec n: 17
SKIP  0.24751694sec n: 17

COUNT 0.34824175sec n: 18
SKIP  0.25229600sec n: 18

COUNT 0.34132899sec n: 19
SKIP  0.25072190sec n: 19

COUNT 0.34307587sec n: 20
SKIP  0.26490709sec n: 20

COUNT 0.34396623sec n: 21
SKIP  0.26642019sec n: 21

COUNT 0.34332623sec n: 22
SKIP  0.26910997sec n: 22

COUNT 0.34318800sec n: 23
SKIP  0.27709716sec n: 23

COUNT 0.35033772sec n: 24
SKIP  0.28053697sec n: 24

COUNT 0.34508086sec n: 25
SKIP  0.29886615sec n: 25

COUNT 0.34138400sec n: 26
SKIP  0.31127590sec n: 26

COUNT 0.34214707sec n: 27
SKIP  0.30926315sec n: 27

COUNT 0.34338794sec n: 28
SKIP  0.31609410sec n: 28

COUNT 0.33892412sec n: 29
SKIP  0.31961889sec n: 29

COUNT 0.34913494sec n: 30
SKIP  0.32460105sec n: 30

COUNT 0.35027319sec n: 31
SKIP  0.34174014sec n: 31

COUNT 0.34157406sec n: 32
SKIP  0.33185586sec n: 32

COUNT 0.34085507sec n: 33
SKIP  0.35337589sec n: 33

COUNT 0.36562802sec n: 34
SKIP  0.35539887sec n: 34

COUNT 0.33971117sec n: 35
SKIP  0.34875798sec n: 35

COUNT 0.34358399sec n: 36
SKIP  0.35080812sec n: 36

COUNT 0.34050809sec n: 37
SKIP  0.35420702sec n: 37

COUNT 0.34160826sec n: 38
SKIP  0.36413503sec n: 38

COUNT 0.34033919sec n: 39
SKIP  0.36870499sec n: 39

COUNT 0.34383471sec n: 40
SKIP  0.37407116sec n: 40

COUNT 0.34056098sec n: 41
SKIP  0.38126107sec n: 41

COUNT 0.35250598sec n: 42
SKIP  0.39190103sec n: 42

COUNT 0.34235793sec n: 43
SKIP  0.38751408sec n: 43

COUNT 0.34066994sec n: 44
SKIP  0.40268203sec n: 44

COUNT 0.34582525sec n: 45
SKIP  0.41063184sec n: 45

COUNT 0.33965299sec n: 46
SKIP  0.40651395sec n: 46

COUNT 0.34476880sec n: 47
SKIP  0.41450114sec n: 47

COUNT 0.34590494sec n: 48
SKIP  0.41863314sec n: 48

COUNT 0.34418027sec n: 49
SKIP  0.41837573sec n: 49

COUNT 0.34255399sec n: 50
SKIP  0.43121814sec n: 50