这是可行的,但我想知道这里是否可以使用IEnumerable?
public static int LongerThanStingCompair(string s, int n)
{
int counter = 0;
// splits based on nextLine break
var sCount = s.Split('\n');
// Cast to list
sCount.ToList();
foreach (var item in sCount)
{
//checks to see if words are a certain charLength
if (item.Length > n)
{
counter++;
}
}
return counter;
}测试类提供的输入如下
狮子,阿佩,老虎,斑马和4
所以它会返回2,因为有两个单词有4个以上的字母。
发布于 2015-09-09 15:00:09
签名:
public static int LongerThanStingCompair(string s, int n)Compair拼写错误,Sting也是--它们应该分别进行比较和字符串。不过,更好的名称可能是CountLinesLongerThan。
s和n不是参数的好名字。
关于你的代码:
// splits based on nextLine break
var sCount = s.Split('\n');这一评论是没有必要的,而且略有错误。代码在所有新行字符上拆分。
// Cast to list
sCount.ToList();这个注释也是不正确的--这并不是简单的转换,而是从数组中创建一个新列表。这是不必要的,因为您只需要枚举行-您不需要列表的功能。
下面是一个基于Linq的备选方案:
public static int CountLinesLongerThan(string source, int characterLimit)
{
if (source == null)
{
throw new ArgumentNullException("source");
}
return source.Split('\n')
.Count(line => line.Length > characterLimit);
}发布于 2015-09-16 12:52:15
var sCount = s.Split('\n');如果要在.net中获得性能,则需要避免分配。如果字符串是数百万行,则此调用将分配一个包含数百万字符串的数组。分配相对便宜,但清理不是。每次调用您的方法后,垃圾收集器都必须努力清理。
sCount是一个糟糕的名字,应该是rows。
sCount.ToList();由于许多原因,这是另一个灾难,它将字符串数组复制到一个随后不使用的列表中。出于性能原因,您肯定不想在这里分配列表,也不希望因为语义原因而需要列表。
在添加和删除项目时,您需要一个List<T>。在版本构建中,这将被优化,因此它将没有成本,但它非常难闻。
对于性能,您需要这样的内容:
private static int CountRowsLongerThan(string text, int min)
{
var counter = 0;
var index = 0;
while (index < text.Length)
{
if (text[index] == '\n') // using '\n' although Environment.NewLine is probably what you want.
{
index++;
}
var rowLength = GetRowLength(text, index);
if (rowLength > min)
{
counter++;
}
index += rowLength;
}
return counter;
}
private static int GetRowLength(string text, int index)
{
var result = 0;
while (index < text.Length && text[index] != '\n') // again using '\n' although Environment.NewLine is probably what you want.
{
index++;
result++;
}
return result;
}正如您所看到的,优化的代码读起来非常糟糕,所以只有当它解决了一个真正的问题时,才进行这种优化。分析器会告诉您这是否是一个问题,尽管分析分配并不简单,因为清理时会带来很大的成本。
这类代码非常重要,需要单元测试。使用LINQ使它变得足够琐碎,不需要进行测试。
一般情况下,您可能希望在Environment.NewLine上拆分如下:
var count = yourText.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries)
.Count(x => x.Length > 4);使用LINQ,我会内联地完成它,而不是将它包装在一个方法中,因为它是一个简单的调用。
https://codereview.stackexchange.com/questions/104235
复制相似问题