2013-09-26 52 views
2

我們被要求創建一個計劃,需要2輸入(我已經解析),用於在飛機座位乘客和隨機放置的乘客座位上的平面內一個輸出,以及因爲將剩下的座位放在次要產出中。剩餘值到二次出

我想知道是否有一種簡單的方法,將HashSet中的剩餘值替換爲listBoxLedige

由於現在的工作,座位被分配但在次級輸出值的arent相關的第一輸出。

if(passengers > seats) 
{ 
    MessageBox.Show("For mange passagerer"); 
} 
else 
{ 
    HashSet<int> check = new HashSet<int>(); 
    for(int i = 0; i <= passengers - 1; i++) 
    { 
     int resultat = rnd.Next(1, seats + 1); 
     while(check.Contains(resultat)) 
     { 
      resultat = rnd.Next(1, seats + 1); 
     } 
     check.Add(resultat); 
     int[] passagerer01 = new int[passengers]; 
     passagerer01[i] = i+1; 
     listBoxFulde.Items.Add("Passager #" + passagerer01[i] + "på sæde #" + resultat); 
    } 
    HashSet<int> ledige01 = new HashSet<int>(); 
    for(int i = 0; i <= (seats - passengers - 1); i++) 
    { 
     int tilbage = rnd.Next(1, seats + 1); 
     while(ledige01.Contains(tilbage)) 
     { 
      ledige01.Add(tilbage); 
     } 
     listBoxLedige.Items.Add("Sæde #" + tilbage); 
+0

難道你不能使用['HashSet.ExceptWith'](http://msdn.microsoft.com/en-us/library/bb299875.aspx)從集合中刪除集合中的所有元素?所以剩下的值就是你想要添加到列表框的所有項目。 –

回答

1

這是我會怎麼做(見RangeExceptWith):

HashSet<int> ledige01 = new HashSet<int>(
    Enumerable.Range(1, seats)); 

ledige01.ExceptWith(taken); 

注意中通過簡單地洗牌座椅和取前N產生可以去除試驗和錯誤的種子:

var taken = HashSet<int>(Enumerable.Range(1,seats).Shuffle().Take(passengers)); 

有關如何洗牌的提示,請參閱eg Optimal LINQ query to get a random sub collection - Shuffle


順便說一句:

int[] passagerer01 = new int[passengers]; 
    passagerer01[i] = i+1; 
    listBoxFulde.Items.Add("Passager #" + passagerer01[i] + "på sæde #" + resultat); 

看起來是其他東西比你需要:)但是我假設它是未完成的,你很可能會意識到,

A的「完全'編輯採取:

if(passengers > seats) 
{ 
    MessageBox.Show("For mange passagerer"); 
} 
else 
{ 
    HashSet<int> taken = new HashSet<int>(); 
    for(int i = 0; i <= passengers - 1; i++) 
    { 
     int resultat; 
     do { 
      resultat = rnd.Next(1, seats + 1); 
     } while(taken.Contains(resultat)); 

     taken.Add(resultat); 

     listBoxFulde.Items.Add("Passager #" + (i+1) + "på sæde #" + resultat); 
    } 

    HashSet<int> ledige01 = new HashSet<int>(
     Enumerable.Range(1, seats)); 

    ledige01.ExceptWith(taken); 

if(passengers > seats) 
{ 
    MessageBox.Show("For mange passagerer"); 
} 
else 
{ 
    HashSet<int> taken = new HashSet<int>(); 
    for(int i = 0; i <= passengers - 1; i++) 
    { 
     int resultat; 
     do { 
      resultat = rnd.Next(1, seats + 1); 
     } while(taken.Contains(resultat)); 

     taken.Add(resultat); 

     listBoxFulde.Items.Add("Passager #" + (i+1) + "på sæde #" + resultat); 
    } 

    HashSet<int> ledige01 = new HashSet<int>(Enumerable.Range(1, seats)); 

    ledige01.ExceptWith(taken); 

    foreach(var tilbage in ledige01) 
     listBoxLedige.Items.Add("Sæde #" + tilbage); 
+0

真的很感謝答案。我用int數組生成乘客號碼。正如我所說,我是一個完整的新手。我確實考慮過ExceptWith,但我還沒有弄清楚如何使用它在listBox中產生輸出。 – user2821342

+0

哦,哈哈。我認爲這是微不足道的,現在我已經擴大了'// etc'這個位。歡呼聲(ps。我假設'tilbage'意味着_available_或_empty_或者其他東西,我們不會說普通話:)) – sehe

+0

再次,它的4小時完全沒有任何編碼經驗,所以我們大多數人都很無知。我非常感謝幫助! – user2821342

2

我不能完全肯定我理解你的問題,但你有沒有采取一看Except LINQ擴展方法?根據你的措辭(「剩餘價值」)來判斷,這對你來說可能是正確的方法。

編輯這裏是它是如何做:

IEnumerable<int> empty = allSeats.Except(check); 

empty現在怎麼是推遲枚舉(除非你做一個.ToArray().ToList()或者它類似)。

+0

不是。您應該始終使用通用擴展方法的成員函數。在這種情況下,因爲事物已經存在於HashSet中,所以效率更高。然後再一次,直到一架飛機有幾十萬個座位,它不應該成爲這個練習的瓶頸。這個原則是:教人們**正確使用正確的數據結構/ ** – sehe

+0

@sehe我同意,人們應該知道如何正確使用數據結構,在這一點上我肯定會和你一起。儘管如此,「Except」也應該可以正常工作。有關更多詳細信息,請參閱http://msdn.microsoft.com/en-us/library/bb397728.aspx。 –

+0

優秀的鏈接。我將+1與討論的警告一樣,它是信息性的。 – sehe

0

不是百分百肯定我理解你的問題或解決方案但是你是否知道你爲每位乘客申報並初始化了passagerer01,然後確定性地(不是隨機地)將座位i+1分配給乘客i,然後丟棄該數組?如果你想保留的信息,你必須申報for環外的陣列。

此外,它看起來並沒有像你在代碼的第二部分中做任何有意義的事情。要確定空座位,通過數字1到passengers是有意義的,檢查它們是否在集合check中,如果不是,則將它們添加到集合ledige01。或者,當然,可以使用sehe建議的庫方法做一些等同的事情。

最後一點,在計算機科學中,你通常從零開始計數。因此,您通常會擁有座位號碼0seats-1並隨機選擇座位,如下所示:rnd.Next(0, seats)。而且你通常會這樣循環:for(int i = 0; i < passengers; i++)而不是for(int i = 0; i <= passengers - 1; i++)

+0

謝謝,我會盡力記下未來項目的技巧。其中大部分都是通過這樣做來學習的,這就是爲什麼代碼是相當潦草的。 – user2821342