2015-03-03 59 views
0

我有一個類的數組,類有2個字段:一個字母和一個數字。根據其中一個字段搜索數組

我正在尋找一種方式來寫:

對於包含指定字符的每個字段,做一些數字。

我知道我能做到這一點是這樣的:

for(int i = 0; i < Array.Length ; i++) 
    if(Array[i].letter == 'a') do something with Array[i].number 

是否有使用foreach循環寫下來的方式或這是正確的方法是什麼?編輯:在我的情況下「做某事」意味着:(我將需要類中的第三個字段,我們稱之爲測試,類型bool和3個int變量,x = 0和y = 0,以及Z =一些數字我前面計算)

if(Array[i].letter == 'a') 
    if(Array[i].test == false) 
     if(Array[i].number < z) x++; 
     else y++; 
+3

如果你能澄清「*做點什麼*」我們可以提供更多的幫助。這是總和,平均,排除? – user3021830 2015-03-03 07:47:39

+1

你目前的方法有什麼問題?這對我來說似乎是完全有效的 – Sayse 2015-03-03 07:49:46

+0

如果你使用foreach或在這裏沒有區別。你有什麼問題?它似乎完全有效。也很想知道是否有一個原因,您不使用KeyValuePair或字典的列表? – 2015-03-03 07:51:17

回答

2

比方說你的類看起來是這樣的:

class MyClass 
{ 
    public int MyNumber { get; set; } 
    public char MyLetter { get; set; } 
    public bool Test { get; set; } 
} 

,你已經有了一個名爲List<MyClass>myList中

如果你想通過其中字母是A,你可以使用LINQ對於該類的每個實例遍歷:

foreach (MyClass myClass in myList.Where(c => c.MyLetter == 'A')) 
{ 
    Console.WriteLine("Number: " + myClass.MyNumber); 
} 

編輯:更新例如,對於你更新的問題:

foreach (MyClass myClass in myList.Where(c => c.MyLetter == 'a' && !c.Test)) 
{ 
    if (myClass.MyNumber < z) 
     x++; 
    else 
     y++; 
} 
+0

使用最後一個迭代變量,請記住'class'是一個關鍵字。 – 2015-03-03 07:58:56

+0

@JeppeStigNielsen啊,哎呀!感謝您指出! – cubrr 2015-03-03 07:59:29

+0

由於我對這些結構很陌生,你能澄清一下MyClass和myClass之間的區別嗎? – Januszoff 2015-03-03 08:07:23

2

您可以使用以下方法:

var newArray = Array.Where(x => x.letter == 'a') 
    .Where(x => !x.test) 
    .Where(x => x.number < z); 

現在你把所有從你的數組中的元素(順便說一句。:Array是您陣列一個相當糟糕的名字)。但是之後,您必須使用forforeach來循環新陣列。

編輯:Ofc。你也可以加入你哪裏子句:

var newArray = Array.Where(x => x.letter == 'a' && !x.test && x.number <z) 

但這似乎有點難看,至少對我來說......程式時,你。

+0

我使用數組名稱只是作爲一個例子,我喜歡8代碼。 – Januszoff 2015-03-03 07:53:30

+1

您應該可以將它們作爲1個lambda表達式加入。 .Where(x => x.letter =='a'&&!x.test && x.number JustinDanielson 2015-03-03 08:02:10

2

我們假設你的數組充滿了MyClass類型的對象。

foreach(MyClass obj in Array) { 
    if(obj.letter == 'a') { 
     // do something 
    } 
} 
0

有辦法做你所追求的LINQ ..

var valids = arrayName.Where(i => i.letter =='a' && !i.test); 
var x = valids.Count(i => i.number < z); 
var y = valids.Count() - x; 

但能源部似乎沒有任何地方接近您當前的方法清晰...

使用foreach循環會給你一個範圍的變量,這可能有助於如果方法擴展更多。

foreach(var item in arrayName) 
    if(item.letter == 'a') 
     ..... 

但是你目前的方法很清楚它正在做什麼,看起來很容易維護。

你的變量名是有點粗略不過,但我這就是希望只是僞代碼:)

相關問題