インデクサーをもっと使いたいのですが、いつ使うべきかわかりません。オンラインで見つけたのはMyClass
、 や などのクラスを使用する例だけIndexerClass
です。
生徒と教師がいて、各教師が担当する生徒のリストを持っている学校システムではどうですか? そのシナリオではインデクサーが必要ですか? 簡単にするために、各生徒は 1 人の教師にしか所属できません。
Heres 私が作成したビデオhttp://www.youtube.com/watch?v=HdtEQqu0yOYと以下は、同じことについての詳細な説明です。
インデクサーは、簡素化されたインターフェイスを使用してクラスに含まれるコレクションにアクセスするのに役立ちます。それは構文糖です。
たとえば、住所コレクションを含む顧客クラスがあるとします。ここで、"Pincode" と "PhoneNumber" でアドレス コレクションを取得したいとします。したがって、論理的な手順は、「PhoneNumber」を使用してフェッチする関数と「PinCode」を使用してフェッチする関数の 2 つのオーバーロードされた関数を作成することです。以下のコードでは、2 つの関数が定義されていることがわかります。
Customer Customers = new Customer();
Customers.getAddress(1001);
Customers.getAddress("9090");
インデクサーを使用する場合、以下のコードに示すように、上記のコードを単純化できます。
Customer Customers = new Customer();
Address o = Customers[10001];
o = Customers["4320948"];
乾杯。
ランダムアクセス
通常、データが順番にアクセスされる場合は、列挙子を使用します。
一方、インデクサーは、特定の要素に直接アクセスするのに役立ちます。特定の順序はありません。
もちろん、これは、必要な要素のインデックスを知っていることを前提としています。たとえば、コンボボックスは常に 2 つの値をサポートしてきました: ユーザーに表示される文字列と、それに属する ID です。コレクションを検索する代わりに、コンボボックスで選択したアイテムの ID を使用して、コレクションのインデックスに直接アクセスできます。
C# のインデクサーの優れた点は、それらをオーバーロードできることです。そのため、さまざまな種類のキーを介して項目にアクセスできます。
通常、クラスがオブジェクトのリスト、コレクション、または配列を表す場合は、インデクサーを使用します。あなたの場合、インデクサーを提供して、教師の生徒にインデックスベースのアクセスを提供できます。
あなたの状況でのインデクサーの使用は、学生 (コレクション) と現在の教師をカプセル化する TeachersClass クラスになります。学生のリストを公開することで同じことができますが、例を示しています。
コード例を次に示します。
public class TeachersClass
{
private List<Student> _students;
public TeachersClass(Teacher currentTeacher, List<Student> students)
{
CurrentTeacher = currentTeacher;
_students = students;
}
public Teacher CurrentTeacher { get; set; }
public Student this[int studentID]
{
get
{
return (from s in _students
where s.Id = studentID
select s).First();
}
}
}
簡単な答え (前述のとおり) は、クラスがアイテムのコレクションを表す/含む場合、インデクサーはコレクションの要素を返すというものです。
public Student this[int index] { ..
より高度なケースでは、特にクラスがマッピングまたはプロセスを表す場合に、クラスを使用してデフォルトの動作を作成し、デリゲートのように見せることができます。たとえば、冷蔵庫内のビールの冷却速度を計算するクラス:
入力する代わりに
temperature = coorsLight.CalculateFutureTemperature(time);
あなたはこれに同意することができます
temperature = coorsLight[time];
クラスの期待される動作 (および意図) が値を返すことである場合。
インデクサーは、配列やコレクションなどの集計から要素を選択する手段です。私は Ian Davis に部分的に同意しますが、インデクサーはパブリック API の洗練以上のものを表していると思います。
インデクサーは、配列にアクセスするための主要な手段であり、.NET BCL で実装されたインデクサーでコレクションを表す主要なクラスのほとんどは、おそらく他の型を集約する型を扱うときに共通の経験を提供するためのものです。
インデクサーは多くの BCL コレクション型へのインターフェイスの標準的な部分であり、これらの型は頻繁に使用されるため、開発者がプラットフォームとして .NET を学習するにつれて、次を使用してコレクションにアクセスできるという期待が作成されることを示唆するのは合理的です。ある種のインデクサー。
型のインターフェースが開発者の期待と一致する場合、開発者は考える必要がないため、その型は使いやすくなります。これは、問題の開発者が組織の内部にいるか、外部にいるかに関係なく当てはまります。
もちろん、インデクサーを使用しても意味がない場合もあります。その場合は、インデクサーを実装しないでください。
インデクサーを使用すると、配列のようにクラスまたは構造体のインスタンスにインデックスを付けることができます。インデクサーは、アクセサーがパラメーターを取ることを除いて、プロパティに似ています。
インデクサーを使用すると、配列と同様の方法でオブジェクトにインデックスを付けることができます。
// C#: INDEXER
using System;
using System.Collections;
class MyClass
{
private string []data = new string[5];
public string this [int index]
{
get
{
return data[index];
}
set
{
data[index] = value;
}
}
}
class MyClient
{
public static void Main()
{
MyClass mc = new MyClass();
mc[0] = "Rajesh";
mc[1] = "A3-126";
mc[2] = "Snehadara";
mc[3] = "Irla";
mc[4] = "Mumbai";
Console.WriteLine("{0},{1},{2},{3},{4}",mc[0],mc[1],mc[2],mc[3],mc[4]);
}
}
クラス内に long があり、その特定の long のいくつかの数字が何かを意味していたときのことを覚えています (たとえば、3 番目の数字が 3 の場合、チャートには特定のタイプのエンコード、私が知っている恐ろしいシステムがあることを意味します)しかし、私はそれを発明しませんでした)
だから私は数字のx桁を返すためにこのようなことをしました:
protected int this[int index]
{
get
{
int tempN = Number;
if (index > 0)
{
tempN /= index * 10;
}
return tempN % 10;
}
}
別の方法で使用されたため保護されていたので、一種のヘルパーでした。もちろん、単純な GetDigit(int a) は同じことでした (そして、より自明です)。=( 以来、それらを使用していません。
IMHO、パッケージ化された API を整えようとしている場合は、おそらくインデクサーが最適です。ミル ビジネス オブジェクトを実行するために努力する価値はありません。
また、特殊なコレクションを作成している場合は、パッケージ化された API を整理することと分類します (すべてを 1 つのモジュールに保持している場合でも)。