2011-08-22 95 views
4

我有這樣的代碼:字符串列表中刪除

List<string> lineList = new List<string>(); 

foreach (var line in theFinalList) 
{ 
    if (line.PartDescription != "") 
     lineList.Add(line.PartDescription + " " + line.PartNumber + "\n"); 
    else 
     lineList.Add("N/A " + line.PartNumber + "\n"); 

    // 
    //This is what I am trying to fix: 
    if (lineList.Contains("FID") || lineList.Contains("EXCLUDE")) 
     // REMOVE THE item in the lineList 
} 

我試圖去通過theFinalList在foreach循環和各行添加到一個名爲lineList新的列表。 添加後,我想從包含文本「FID」該列表中刪除任何條目「排除」

我無法刪除條目,有人可以幫助我嗎?

+5

更換"\n"豈不是更好不要在第一個地方添加這些項目? –

回答

7

爲什麼當你想右後刪除它們來進行添加:

lineList = theFinalList.Select(line => 
{ 
    if (line.PartDescription != "") 
     return line.PartDescription + " " + line.PartNumber + "\n"; 
    else 
     return "N/A " + line.PartNumber + "\n"; 
}) 
.Where(x => !(x.Contains("FID") || x.Contains("EXCLUDE"))) 
.ToList(); 
1

,而你是在foreach循環遍歷theFinalList無法刪除您theFinalList列表中的項目。在這種情況下,您可能會收到System.InvalidOperationException與消息「收集已修改;枚舉操作可能不會執行「

你必須做這樣的事情:

List<string> removals = new List<string>(); 

foreach (string s in theFinalList) 
{ 
    //do stuff with (s); 
    removals.Add(s); 
} 

foreach (string s in removals) 
{ 
    theFinalList.Remove(s); 
} 
1

嘗試

foreach (var line in theFinalList) 
{ 
    string T = ""; 
    if (line.PartDescription != "") 
     T = line.PartDescription + " " + line.PartNumber + "\n"; 
    else 
     T = "N/A " + line.PartNumber + "\n"; 

    if (!(T.Contains("FID") || T.Contains("EXCLUDE")) 
     lineList.Add (T); 
} 
1

試試這個:

var excludingTexts = new [] { "FID", "EXCLUDE" } 
lineList = lineList.Where(y => !excludingTexts.Any(x => line.PartDescription.Contains(x) || line.PartNumber.Contains(x))).ToList(); 

或者你也可以把它改寫如:

var excludingTexts = new [] { "FID", "EXCLUDE" } 
List<string> lineList = (from line in theFinalList 
         where !excludingTexts.Any(x => line.PartDescription.Contains(x) || line.PartNumber.Contains(x)) 
         select line.PartDescription != "" ? 
           line.PartDescription + " " + line.PartNumber + "\n" : 
           "N/A " + line.PartNumber + "\n" 
         ).ToList(); 
+0

只有line.Contains(x)將不起作用(行不是字符串),並且我們應該使用line.PartDescription.Contains和line.PartNumber.Contains在這一點上,具有重複邏輯的三元運算符也不是非常可讀的I認爲 –

+0

更新瞭解決方案,以代替使用'PartDescription'和'PartNumber'。 –

3

以下代碼示例遍歷lineList並刪除包含FID或EXCLUDE的行。

for(int i = lineList.Count - 1; i >= 0; i--) 
{ 
    if (lineList[i].Contains("FID") || lineList[i].Contains("EXCLUDE")) 
     lineList.RemoveAt(i); 
} 

刪除項目時,以相反順序遍歷列表很重要。

1

我認爲它更符合邏輯的做法

Regex exclude = new Regex("FID|EXCLUDE"); 
foreach (var line in theFinalList.Where(
ln => !exclude.Match(ln.PartDescription).Success && 
     !exclude.Match(ln.PartNumber).Success))){ 

    string partDescription = "N/A"; 
    if(!string.IsNullOrWhiteSpace(line.PartDescription)){ 
     partDescription = line.PartDescription; 
    } 
    lineList.Add(partDescription + " " + line.PartNumber + "\n"); 
} 

編輯正則表達式您的需求(也許忽略大小寫或者多行,可能太編譯),並隨時與Environment.NewLine