【C#】LINQのTake()メソッドでシーケンスの先頭から指定した数の要素を取得する方法
C#では、LINQを活用することでコレクションの操作を簡潔に記述できます。本記事では、OrderByDescendingメソッドで配列を降順に並べ替え、Take()メソッドを使ってシーケンスの先頭から指定した数の要素を取得する方法を解説します。
処理の流れ
1. 配列を用意する
まずは、対象となる整数型の配列を定義します。
int[] prod = { 290, 340, 129, 540, 456, 898, 765, 789, 345};2. 降順に並べ替えて先頭の要素を取得する
次に、AsQueryable()でクエリ可能な形式に変換し、OrderByDescendingで降順ソートを行います。その後、Take(2)を呼び出すことで、先頭から2つの要素を取得できます。
IEnumerable<int> units = prod.AsQueryable().OrderByDescending(s => s).Take(2);
このように、降順に並べ替えたシーケンスに対してTake()を適用すると、「上位N件」を簡単に抽出できます。売上ランキングやスコアの上位者表示など、実務でも頻繁に使われるパターンです。
サンプルコード全体
ここまでの内容をまとめた完全なコードが以下です。
using System;
using System.Linq;
using System.Collections.Generic;
public class Demo {
public static void Main() {
int[] prod = { 290, 340, 129, 540, 456, 898, 765, 789, 345};
// 上位2つの製品の数量を取得
IEnumerable<int> units = prod.AsQueryable().OrderByDescending(s => s).Take(2);
foreach (int res in units) {
Console.WriteLine(res);
}
}
}実行結果
898 789
解説のポイント
- OrderByDescending(s => s): 各要素をキーとして降順にソートします。オブジェクトのコレクションの場合は、
s => s.PropertyNameのように任意のプロパティを指定できます。 - Take(2): シーケンスの先頭から指定した件数(ここでは2件)だけ要素を取り出します。遅延実行されるため、
foreachなどで列挙した時点で評価されます。
最大値から順に複数の要素を取得したい場合、この組み合わせは非常に有効です。ぜひ実際のプロジェクトでも活用してみてください。
-
Pythonでリストの各要素より右側にある小さい要素の数を返すプログラム
問題概要 数値のリスト nums が与えられたとします。このとき、元のリストの各要素について、その要素より右側に存在する小さい要素の個数を求め、それらを並べた新しいリストを作成する問題を考えてみましょう。 例えば、入力が nums = [4, 5, 9, 7, 2] の場合、出力は [1, 1, 2, 1, 0] になります。これは次のような理由によるものです。 4 の右側にある小さい要素は 1 個(2) 5 の右側にある小さい要素は 1 個(2) 9 の右側にある小さい要素は 2 個(7 と 2) 7 の右側にある小さい要素は 1 個(2) 2 の右側には小さい要素が存在しないため 0 個
-
【Python】ソート済みリストからk番目に欠けている数を効率的に求める方法
ソートされた重複のない整数リスト nums と整数 k が与えられたとき、リストの最初の要素を基準にして、k番目(0始まりのインデックス)に相当する欠落した数を見つける問題を考えてみましょう。 問題の例 例えば、nums = [5,6,8,10,11]、k = 1 という入力の場合を確認します。このリストには「7」と「9」という2つの数が欠けています。7がインデックス0(1番目)の欠落数、9がインデックス1(2番目)の欠落数に対応するため、k = 1 のときの出力は 9 となります。 解決のためのアプローチ この問題は、隣り合う要素同士の差に注目することで解けます。各間隔にいくつの数が欠け