字符串是由类定义的,如下 1 public sealed class String : IComparable, ICloneable, IConvertible, IComparable<string>, IEnumerable<char>, IEnumerable, IEquatable<string> 注意它从接口IEnumerable<char>派生,那么如果想得到所有单个字符,那就简单了, 1 List<char> chars = s.ToList(); 如果要对字符串进行统计,那也很简单: 1 int cn = s.Count(itm => itm.Equals('{')); 如果要对字符串反转,如下: 1 new string(s.Reverse().ToArray()); 如果对字符串遍历,那么使用扩展方法ForEach就可以了。 现在有一个需求 ,对一个list的字符串,我想对满足某些条件的进行替换,不满足条件的保留下来。问题来了,在forach的时候不能对字符串本身修改。因为msdn有如下的描述: A String object is called immutable (read-only) because its value cannot be modified once it has been created. Methods that appear to modify a String object actually return a new String object that contains the modification. 所以如下代码其实是构造了两个字符串: 1 string st = "Hello,world"; 2 st = "Hello,world2"; 回到那个问题,我想一个很简单的方法是先构造一个List<string>,然后对原字符串遍历 ,满足条件的修改后加入新的list,不满足的直接加入。这种方法很简单原始,效率也是最高的。Linq里面有UNION这个关键字,sql里面也有UNION这个集合操作,那么把它拿来解决这个问题如下:
var matchItem = ( from c in input where reg.IsMatch(c) select reg.Replace(c, matchEvaluator) ).Union( from c in input where !reg.IsMatch(c) select c );
return matchItem.ToList<string>(); }
private string matchEvaluator(Match m) { return m.Groups[2].Value; }