2012-02-24 4 views
1

おはようございます、同じタイプの値に対するビット単位のアプローチによる理想的なC#の削減方法?

私はクラスとプロパティを持っています。私はそのクラスのインスタンスを3つ持っています。

public class myclass { 
    public int myproperty; 
} 

... 

myclass inst1, inst2, inst3; 

... 

今ある時点で私は、これら3つのプロパティ値を比較する必要があり、値の最小量で終わるために、それらが等しいかどうかであることを確認します。

だから私はmagic_function_call後

inst1.myproperty = 3; 
inst2.myproperty = 5; 
inst3.myproperty = 3; 

を持っている場合、私は3と5

を取得する必要がありますそして、私はmagic_function_call後

inst1.myproperty = 2; 
inst2.myproperty = 2; 
inst3.myproperty = 2; 

を持っている場合、私は2を取得する必要があります。

これは自明ではありませんが、多くのIFチェックで解決できます将来的に別の変数をチェックに追加する必要があるかもしれないという事実を考慮して、必要に応じて、これを行う方法が最も速く、より効率的な方法であると思っていました。

私は、これをエレガントかつ迅速に解決できるビット単位の操作があるかどうかは疑問です。

また、同じ目標を達成するために使用できる配列操作がありますか?私は「削減」や「圧縮」を探してみましたが、それらのキーワードは適切な方向に進むとは思われません。

ありがとうございます。

答えて

1

は、余分なライブラリを必要としない迅速な機能だとLINQに関連したセットアップコストとオーバーヘッドを回避:

static int[] Reduce(IEnumerable<myclass> items) 
    { 
     HashSet<int> uniqueValues = new HashSet<int>(); 

     foreach (var item in items) 
     { 
      uniqueValues.Add(item.myproperty); 
     } 

     return uniqueValues.ToArray(); 
    } 

はそれをあなたのMyClassのインスタンスのコレクションをパスし、それが返されます一意のmyproperty値の配列。

+0

非常に良い解決策。これは確かに実際にlinqよりも多目的に見えます。 – roamcel

4

インスタンスのすべてのコレクションに属している場合は、morelinqDistinctByクエリ演算子を使用することができます。

List<MyClass> myList = new List<MyClass>(); 
.. populate list 
List<MyClass> distinct = myList.DistinctBy(mc => mc.myproperty).ToList(); 

質問を見て、あなただけのプロパティ値の一覧(intのリスト)とよいでしょう

List<int> distinct = myList.Select(mc => mc.myproperty).Distinct().ToList(); 

パブリックフィールドを定義しましたが、プロパティを定義していないことに注意してください。 autoプロパティの変更を定義するには:

public int myproperty; 

public int myproperty { get; set; } 

にもそのPascalCasingは、プロパティ名とクラス名のために推奨されます。

+0

Distinct()呼び出しの後にToList()を呼び出すマイナーな編集を追加しました。 –

+0

リストdistinct = myList.Distinct(mc => mc.myproperty); ' –

+0

ありがとう、私はまた、Distinctの標準クエリ演算子がキーセレクタを取らないことを認識しました。 morelinqのDistinctByを使用してください。 – devdigital

1

これを実装するのはちょっとした方法です。ここで

var result = myList.GroupBy(p => p.myproperty).Select(p => p.First()); 
関連する問題