2013-04-02 44 views
2

我有這樣的預定義的字符串數組:動態地刪除並從列表中添加其他信<>保持字母順序

string[] SkippedAreasArray = new string[] {"A", "B", "C", "D", "E", "F", "G", 
      "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q"}; 

並且根據用戶輸入I填充List<string>這樣的:

List<String> UsedAreas = new List<String>(); 
int RangeOfInput = (int)entity.AreasCnt; 
UsedAreas = SkippedAreasArray.ToList().GetRange(0, RangeOfInput); 

也從用戶輸入我得到另一個字符串包含A to Q非重複的字母(如在SkippedAreasArray)。

數組是這樣形成:

SkippedAreasFromForm = (txtSkippedAreas.Text).ToUpper().Split(','); 

我要做的就是先 - 排序SkippedAreasFromForm

Array.Sort<string>(SkippedAreasFromForm); 

然後我需要以下條件:

foreach (string tempAreaValue in SkippedAreasFromForm) 
{ 
    if (UsedAreas.Contains(tempAreaValue)) 
    { 

    } 
    else 
    { 

    } 
} 

如果List<> UsedAreas包含被選中的字母我想從此信中刪除列表並同時添加下一個按字母順序排列的字母。

PS

我現在看到的是我的目標不明確這裏,所以我會解釋這是什麼意思:

SkippedAreasFromForm是需要驗證用戶輸入,那就是希望這個算法的思想。如果在某些情況下,if (UsedAreas.Contains(tempAreaValue))返回false,那麼輸入是錯誤的,我需要返回錯誤消息。

+0

它從你的[前一個問題]有何不同(http://stackoverflow.com/questions/ 15749935/DO-所有元素從 - 一個陣列-滿足所-某些條件確定逐另一-ST)? – MarcinJuraszek

回答

4

您可以使用LINQ到對象實現,如果沒有循環:

UsedAreas = SkippedAreasArray.Except(SkippedAreasFromForm) 
          .OrderBy(e => e) 
          .Take(RangeOfInput) 
          .ToList(); 

它正在從SkippedAreasArrayRangeOfInput元素不在SkippedAreasFromForm。結果是List<string>

更新

您可以檢查您的錯誤信息條件的方式:

if(SkippedAreasFromForm.Except(SkippedAreasArray.Take(RangeOfInput)).Any()) 
{ 
    // incorrect user input 
} 
+0

對不起,我看到我誤導了,因爲沒有解釋這背後的想法。請閱讀已編輯的帖子。 – Leron

+0

仍然認爲你不需要一個循環。查看我的更新。 – MarcinJuraszek

+0

老實說 - 我不明白這個LINQ查詢,但它的工作原理。謝謝。 – Leron

1
IEnumerable<string> usedAreas = SkippedAreasArray.Take(RangeOfInput); 
IEnumerable<string> skippedAreasFromForm = (txtSkippedAreas.Text).ToUpper() 
    .Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); 
IEnumerable<string> invalids = skippedAreasFromForm.Except(usedAreas); 
if (invalids.Any()) 
    MessageBox.Show(string.Format("These are invalid: [{0}]", 
     string.Join(",", invalids.OrderBy(sa => sa)))); 
相關問題