実現したいこと
C#のLinqを使い、以下のようなことをしたいです
- 実装時に、IDの重複が無いかどうかを調べたい
- 重複が無ければ、何もしない
- 重複があれば、そのIDと該当するクラス名をLogに出力したい
解決方法
var duplicationCustomers = CreateCustomers().GroupBy(x => x.Id).Where(x => x.Count() > 1).SelectMany(x => x); foreach (var customer in duplicationCustomers ) { Debug.LogFormat("{0}:{1}", customer.Id, customer.GetType().Name); }
前提条件
こういったクラスを多数作った際にIdの重複が無いかをチェックしたいです。
class Program { interface ICustomer { string Id { get; } void Action(); } public class CustomerA : ICustomer { public string Id => "A"; public voic ACtion() { //個別処理 } } public class CustomerB : ICustomer { public string Id => "B"; public voic ACtion() { //個別処理 } } public class CustomerC : ICustomer { public string Id => "C"; public voic ACtion() { //個別処理 } } static void Main(string[] args) { string id = GetId(); ICustomer _customer = CreateCustomer(id) if(_customer != null) _customer.Action(); } static string GetId() { return ("サーバーから取得したID"); } static ICustomer CreateCustomer(string id) { //swich(id) //{ // case id = "A": // return new CustomerA(); // break; // case id = "B": // return new CustomerB(); // break; // case id = "C": // return new CustomerC(); // break; // ・ // ・ // ・ // 各CustomerクラスにIDを紐付け、Customerクラスが増えたときに、 // Caseが増えるのを避けたい // case id = "D": // return new CustomerD(); // break; // default: // //エラー処理 // break; //} //そのため、switchCaseを使わずに、以下のような実装を検討している return CreateCustomers().FirstOrDefault(x => x.id == id); } }
Reflectionの機能を用いた以下のようなメソッドにより、ICustomerを継承しているクラスの一覧を取得した後に
private static IEnumerable<ICustomer> CreateCustomers() { return Assembly.GetExecutingAssembly().GetTypes() .Where(x => x.IsClass && x.BaseType == typeof(ICustomer)) .Select(x => (ICustomer)System.Activator.CreateInstance(x)); }
Linqを使ってうまく書きたいのですが、うまい書き方があれば教えてください。
よろしくお願いいたします。
環境
C# 4.0
クラスにIDが紐付いているならstaticかattributeにしたほうがよくて、インスタンスに紐付けるならICustomerにプロパティを実装すればいいと思うのですが、これなにがしたいんですか?
ICustomer は名前だけ見るとインターフェースのようですが、BaseType でインターフェースは取得できません。クラスであれば I の頭文字は誤解を招くので止めましょう。
またクラスに定数の ID を付与するのであれば、重複のあるなしは設計時にチェックするものであって実行時ではないはずです。重複しない ID のつけ方を調べるのが良いのではないでしょうか。今はどうやってつけていますか?
ozwkさん 本来やりたいことを追記しました。
Zuishinさん インターフェースの指摘の件、ありがとうございます。修正しておきます。
ID付与方法の件は、設計時にチェックしています。今回は、実装時の転記ミス等による重複チェックを目的としてます。
回答5件
あなたの回答
tips
プレビュー