2012-02-24 12 views
1

美好的一天,理想的c#減少同一類型的值的方法,按位方法?

我有一個類和一個屬性,我有這個類的三個實例。

public class myclass { 
    public int myproperty; 
} 

... 

myclass inst1, inst2, inst3; 

... 

現在在某一點上我需要比較這三個屬性值,並驗證它們相等與否,其值最少的結束了。

所以,如果我有

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

的magic_function_call後,我應該得到3和5

如果我有

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

的magic_function_call後,我應該得到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 2012-02-24 11:54:09

4

可以使用morelinqDistinctBy查詢操作,如果所有的情況下都屬於集合:

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

望着問題,你可能只想要屬性值的列表(整型的列表) ,您可以使用標準查詢運算符實現:

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

請注意,您尚未定義屬性,因此您已定義了公用字段。要定義自動屬性變化:

public int myproperty; 

public int myproperty { get; set; } 

還要注意PascalCasing建議物業和類名。

+0

添加了一個次要編輯 - 在Distinct()調用之後調用ToList()。 – 2012-02-24 08:23:05

+0

不應該是他的'清單 distinct = myList.Distinct(mc => mc.myproperty);' – 2012-02-24 08:23:24

+0

是的,謝謝:)我也意識到不同的標準查詢操作符沒有采用一個關鍵選擇器,所以你可以使用來自morelinq的DistinctBy。 – devdigital 2012-02-24 08:26:06

1

只是anohter方式來實現它。

var result = myList.GroupBy(p => p.myproperty).Select(p => p.First());