我有一串文字,并希望确保它最多只包含一个特定字符(,
)。因此,我想保留第一个,但只是删除该字符的所有进一步出现。
我怎样才能以最优雅的方式使用C#?
答案 0 :(得分:3)
这是有效的,但肯定不是最优雅的:-)
string a = "12,34,56,789";
int pos = 1 + a.IndexOf(',');
return a.Substring(0, pos) + a.Substring(pos).Replace(",", string.Empty);
答案 1 :(得分:2)
您可以使用计数器变量和StringBuilder
来有效地创建新字符串:
String rule = "package boot\n" +
"\n" +
"rule \"Stamp\"\n" +
"when\n" +
"\t$o: Object()\n" +
"then\n" +
"\tSystem.out.println($o);\n" +
"end\n";
InputStream ruleStream = new ByteArrayInputStream(rule.getBytes());
Resource ruleResource = ResourceFactory.newInputStreamResource(ruleStream);
helper.addResource(ruleResource, ResourceType.DRL);
这种方法不是最短的,但效率很高,您可以指定要保留的字符数。
这是使用LINQ的更“优雅”的方式:
var sb = new StringBuilder(text.Length);
int maxCount = 1;
int currentCount = 0;
char specialChar = ',';
foreach(char c in text)
if(c != specialChar || ++currentCount <= maxCount)
sb.Append(c);
text = sb.ToString();
我不喜欢它,因为它需要修改查询中的变量,所以它会导致副作用。
答案 2 :(得分:1)
您可以编写一个类似下面的函数,根据您搜索的位置(通过String.Split()
方法)将字符串拆分为两个部分,它只会删除第二部分的匹配项(使用String.Replace()
):
public static string RemoveAllButFirst(string s, string stuffToRemove)
{
// Check if the stuff to replace exists and if not, return the original string
var locationOfStuff = s.IndexOf(stuffToRemove);
if (locationOfStuff < 0)
{
return s;
}
// Calculate where to pull the first string from and then replace the rest of the string
var splitLocation = locationOfStuff + stuffToRemove.Length;
return s.Substring(0, splitLocation) + (s.Substring(splitLocation)).Replace(stuffToRemove,"");
}
您可以使用以下方法调用它:
var output = RemoveAllButFirst(input,",");
更漂亮的方法实际上可能涉及构建一个更干净地处理这个问题的扩展方法:
public static class StringExtensions
{
public static string RemoveAllButFirst(this string s, string stuffToRemove)
{
// Check if the stuff to replace exists and if not, return the
// original string
var locationOfStuff = s.IndexOf(stuffToRemove);
if (locationOfStuff < 0)
{
return s;
}
// Calculate where to pull the first string from and then replace the rest of the string
var splitLocation = locationOfStuff + stuffToRemove.Length;
return s.Substring(0, splitLocation) + (s.Substring(splitLocation)).Replace(stuffToRemove,"");
}
}
将通过以下方式调用:
var output = input.RemoveAllButFirst(",");
答案 3 :(得分:1)
正则表达式很优雅,对吧?
Regex.Replace("Eats, shoots, and leaves.", @"(?<=,.*),", "");
这会替换每个逗号,只要它前面有逗号,没有任何内容。
(实际上,它可能并不优雅 - 它可能只是一行代码,但它也可能是O(n^2)
...)
答案 4 :(得分:1)
如果你不处理大字符串,你就像Linq oneliners那样:
public static string KeepFirstOccurence (this string @string, char @char)
{
var index = @string.IndexOf(@char);
return String.Concat(String.Concat(@string.TakeWhile(x => @string.IndexOf(x) < index + 1)), String.Concat(@string.SkipWhile(x=>@string.IndexOf(x) < index)).Replace(@char.ToString(), ""));
}
答案 5 :(得分:0)
static string KeepFirstOccurance(this string str, char c)
{
int charposition = str.IndexOf(c);
return str.Substring(0, charposition + 1) +
str.Substring(charposition, str.Length - charposition)
.Replace(c, ' ').Trim();
}
答案 6 :(得分:-1)
Linq很短;将字符串拆分为字符,保持不同的集合并连接回字符串。
text = string.Join("", text.Select(c => c).Distinct());