首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数比设定长度长的单词

数比设定长度长的单词
EN

Code Review用户
提问于 2015-09-09 14:46:29
回答 2查看 173关注 0票数 3

这是可行的,但我想知道这里是否可以使用IEnumerable

代码语言:javascript
复制
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个以上的字母。

EN

回答 2

Code Review用户

回答已采纳

发布于 2015-09-09 15:00:09

签名:

代码语言:javascript
复制
public static int LongerThanStingCompair(string s, int n)

Compair拼写错误,Sting也是--它们应该分别进行比较和字符串。不过,更好的名称可能是CountLinesLongerThan

sn不是参数的好名字。

关于你的代码:

代码语言:javascript
复制
// splits based on nextLine break
var sCount = s.Split('\n');

这一评论是没有必要的,而且略有错误。代码在所有新行字符上拆分。

代码语言:javascript
复制
// Cast to list
sCount.ToList();

这个注释也是不正确的--这并不是简单的转换,而是从数组中创建一个新列表。这是不必要的,因为您只需要枚举行-您不需要列表的功能。

下面是一个基于Linq的备选方案:

代码语言:javascript
复制
public static int CountLinesLongerThan(string source, int characterLimit)
{
    if (source == null) 
    {
        throw new ArgumentNullException("source");
    }
    return source.Split('\n')
        .Count(line => line.Length > characterLimit);
}
票数 6
EN

Code Review用户

发布于 2015-09-16 12:52:15

,因为这是用性能标记的:

代码语言:javascript
复制
var sCount = s.Split('\n');

如果要在.net中获得性能,则需要避免分配。如果字符串是数百万行,则此调用将分配一个包含数百万字符串的数组。分配相对便宜,但清理不是。每次调用您的方法后,垃圾收集器都必须努力清理。

sCount是一个糟糕的名字,应该是rows

代码语言:javascript
复制
sCount.ToList();

由于许多原因,这是另一个灾难,它将字符串数组复制到一个随后不使用的列表中。出于性能原因,您肯定不想在这里分配列表,也不希望因为语义原因而需要列表。

在添加和删除项目时,您需要一个List<T>。在版本构建中,这将被优化,因此它将没有成本,但它非常难闻。

对于性能,您需要这样的内容:

代码语言:javascript
复制
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上拆分如下:

代码语言:javascript
复制
var count = yourText.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries)
                    .Count(x => x.Length > 4);

使用LINQ,我会内联地完成它,而不是将它包装在一个方法中,因为它是一个简单的调用。

票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/104235

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档