C# C高级字符串操作或LINQ-如何

C# C高级字符串操作或LINQ-如何,c#,linq,c#-3.0,C#,Linq,C# 3.0,我不知道该怎么办。我有一个动态逗号分隔字符串: A - B, Hello, C - D, World 我需要获取该字符串并删除/过滤掉所有包含-的项的实例。因此,期望的结果将是一个新字符串,如下所示: Hello, World var apps = lbAppGroup.Items.Cast<ListItem>().Where(i => i.Selected).Where(s => !s.Contains("-")).Select(i => i.Value);

我不知道该怎么办。我有一个动态逗号分隔字符串:

A - B, Hello, C - D, World
我需要获取该字符串并删除/过滤掉所有包含-的项的实例。因此,期望的结果将是一个新字符串,如下所示:

Hello, World
var apps = lbAppGroup.Items.Cast<ListItem>().Where(i => i.Selected).Where(s => !s.Contains("-")).Select(i => i.Value);
Regex re = new Regex("(?<=[,^]\s*)[^-]+(?=[,$])");
现在,如果无法使用字符串操纵来完成此操作,则字符串来自

IEnumerable<string>
使用linq。所以也许有一种方法可以通过使用LINQ获得我想要的结果

代码如下:

var apps = lbAppGroup.Items.Cast<ListItem>().Where(i => i.Selected).Select(i => i.Value);
string selectedAppValues = String.Join(", ", apps.ToArray());
这将返回我的初始示例


我用的是C3.5。任何指导或示例都将不胜感激

这将返回序列中不包含破折号的所有字符串:

apps.Where(s => !s.Contains("-"));
您可以链接LINQ语句,以便将其添加到select中,如下所示:

Hello, World
var apps = lbAppGroup.Items.Cast<ListItem>().Where(i => i.Selected).Where(s => !s.Contains("-")).Select(i => i.Value);
Regex re = new Regex("(?<=[,^]\s*)[^-]+(?=[,$])");

就像你已经在做的那样,用LINQ来做:

var apps = lbAppGroup.Items.Cast<ListItem>().Where(i => i.Selected && !i.Value.Contains("-")).Select(i => i.Value);
string selectedAppValues = String.Join(", ", apps.ToArray());
此外,还可以使用如下正则表达式:

Hello, World
var apps = lbAppGroup.Items.Cast<ListItem>().Where(i => i.Selected).Where(s => !s.Contains("-")).Select(i => i.Value);
Regex re = new Regex("(?<=[,^]\s*)[^-]+(?=[,$])");

但是,如果您只有字符串,您才会这样做。

就我个人而言,我有一个扩展方法

// takes any IEnumerable, not just strings (like an int array for example)
public static string Join(this IEnumerable source, string delimiter = ", ")
{
   return string.Join(
            delimiter, 
            source.OfType<object>()
            .Select(i => i == null ? "null" : i.ToString()).ToArray()
           )
}
如果你真的想一直走下去

lbAppGroup.Items.Cast<ListItem>().Where(i => i.Selected)
.Where(i => i.Value.Contains("-"))
.Select(i => i.Value).Aggregate((x, y) => x + ", " + y);

对于非常大的集合,这不会像string.Join那样执行。

我不能在LINQ Specialary中发表评论,但我可以告诉您如何操作此字符串

A-B,你好,C-D,世界

如果每个字符串用逗号分隔,则每个字符串都是字符串列表中的一项

第一步是解析出每个项目。将每个字符从开头添加到单独的字符串中。点击逗号后,将该字符串添加到字符串数组中,清除该字符串,然后移动到下一个字符或空格后的下一个字符。像这样:

Begin   -> ""
[0] = A -> "A"
[1] =   -> "A "
[2] = - -> "A -"
...
[5] = , -> "A - B"
list<string>.add("A - B")
或者别的什么

现在这一切都已经准备好了,你可以把清单上所有的东西都砍掉,然后马上做: 1.确定当前项目 2.如果其中有-,则不要将其添加到最后一个字符串中 3.否则,用逗号将其添加
4.移动到下一项并重复直到完成

为什么不将Where子句更改为.Wherei=>i.Selected&!i、 值。包含-。只要i.Value是字符串,它就可以正常工作。非常感谢您的帮助!我不会写循环或任何东西来分割字符串。你不可能比那些编写正则表达式和字符串库函数的人更擅长这些东西。