2011-08-22 50 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