相关疑难解决方法(0)

应该避免LINQ,因为它很慢吗?

我有人被告知,因为.net linq是如此之慢,我们不应该使用它,并且想知道其他人是否得出了相同的结论,例如:

花了1443ms做了1000000000比较非LINQ.
花了4944ms与LINQ做了1000000000比较.
(慢243%)

非LINQ代码:

for (int i = 0; i < 10000; i++)
{
    foreach (MyLinqTestClass1 item in lst1) //100000 items in the list
    {
        if (item.Name == "9999")
        {
            isInGroup = true;
            break;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

花了1443ms做了1000000000比较非LINQ.

LINQ代码:

for (int i = 0; i < 10000; i++)  
    isInGroup = lst1.Cast<MyLinqTestClass1>().Any(item => item.Name == "9999");  
Run Code Online (Sandbox Code Playgroud)

花了4944ms与LINQ做了1000000000比较.

我想它可以优化LINQ代码,但想到的是它很容易得到非常慢的LINQ代码,并且考虑到它不应该被使用.鉴于LINQ很慢,那么PLINQ也会很慢,NHibernate LINQ会很慢,所以不应该使用LINQ语句中的任何类型.

有没有人发现LINQ是如此之慢以至于他们希望从未使用它,或者我是否根据这样的基准做出了过于笼统的结论?

.net c# linq performance

57
推荐指数
6
解决办法
2万
查看次数

在.Net中LINQ和Lambda表达的效率和性能是什么?

我使用.Net 3.5和VS 2008一个多月了.像大多数.Net开发人员一样,我已经从.Net 1.0&2.0和VS 2005的多年经验发展而来.就在最近,我发现了LINQ和Lambda表达式的简单性和强大功能,就像我最近的问题一样,例如在列表中查找项目LINQ,使用Lambda或LINQ 类实例转换或映射到另一个实例的列表,并使用Lambda或LINQ 将类列表转换或映射到另一个类列表.

我承认Lambda和LINQ更简单易读,看起来非常强大.在幕后,.Net编译器必须生成大量代码才能实现这些功能.因此,我对转换到新语法有点犹豫,因为我已经知道了实现相同结果的"旧"方法.

我的问题是关于Lambda和LINQ的效率和性能.也许Lambda表达式大多是内联函数,在这种情况下我猜Lambda应该没问题.LINQ怎么样?

让我们将讨论限制为LINQ-to-Objects LINQ-to-SQL(LINQ-to-SQL).任何评论,比较和经验?

.net c# linq lambda .net-3.5

38
推荐指数
3
解决办法
4万
查看次数

有什么方法可以改进这种字符串切片方法

我写了这个字符串扩展一段时间后,我实际上得到了相当多的使用.

public static string Slice(this string str, int? start = null, int? end = null, int step = 1)
{
    if (step == 0) throw new ArgumentException("Step cannot be zero.", "step");

    if (start == null)
    {
        if (step > 0) start = 0;
        else start = str.Length - 1;
    }
    else if (start < 0)
    {
        if (start < -str.Length) start = 0;
        else start += str.Length;
    }
    else if (start > str.Length) start = str.Length;

    if (end == null) …
Run Code Online (Sandbox Code Playgroud)

c# string slice

9
推荐指数
1
解决办法
1303
查看次数

如何加快递归搜索功能?

我在编写搜索功能的速度方面遇到了麻烦.功能步骤如下所述:

  1. 该函数以两个表名参数开始,即起始点和目标
  2. 然后,该函数遍历表 - 列组合列表(50,000长)并检索与起始点表关联的所有组合.
  3. 然后该函数循环遍历每个检索到的组合,并且对于每个组合,它再次遍历表 - 列组合列表,但这次查找与给定列匹配的表.
  4. 最后,函数遍历从最后一步检索到的每个组合,并且对于每个组合,它检查表是否与目标表相同; 如果是这样它会保存它,如果不是,它会调用自己传递表名形式的组合.

功能目标是能够跟踪链接直接或具有多个分离度的表之间的链接.递归级别是固定的整数值.

我的问题是,每当我尝试在两个级别的搜索深度上运行此功能时(在此阶段不敢尝试更深),作业内存不足,或者我失去了耐心.我等了17分钟才把工作用完了一次.

每个表的平均列数为28,标准差为34.

下面的图表显示了可以在表之间建立的各种链接的示例:

每列可以在多个表中匹配. 然后,可以逐列搜索每个匹配表,以查找具有匹配列的表,依此类推

这是我的代码:

private void FindLinkingTables(List<TableColumns> sourceList, TableSearchNode parentNode, string targetTable, int maxSearchDepth)
{
    if (parentNode.Level < maxSearchDepth)
    {
        IEnumerable<string> tableColumns = sourceList.Where(x => x.Table.Equals(parentNode.Table)).Select(x => x.Column);

        foreach (string sourceColumn in tableColumns)
        {
            string shortName = sourceColumn.Substring(1);

            IEnumerable<TableSearchNode> tables = sourceList.Where(
                x => x.Column.Substring(1).Equals(shortName) && !x.Table.Equals(parentNode.Table) && !parentNode.Ancenstory.Contains(x.Table)).Select(
                    x => new TableSearchNode { Table = x.Table, Column = x.Column, Level = parentNode.Level + 1 });
            foreach (TableSearchNode table …
Run Code Online (Sandbox Code Playgroud)

c# linq tree recursion search

9
推荐指数
1
解决办法
353
查看次数

根据字数过滤字符串

我试图根据每个字符串中的单词数过滤字符串列表.我假设您将修剪字符串末尾的任何空格,然后计算字符串中剩余的空格数,以便WordCount = NumberOfSpaces + 1.这是最有效的方法吗?我知道对于基于字符数的过滤,以下工作正常...只是无法弄清楚如何使用C#/ LINQ简洁地编写它.

if (checkBox_MinMaxChars.Checked)
{
    int minChar = int.Parse(numeric_MinChars.Text);
    int maxChar = int.Parse(numeric_MaxChars.Text);

    myList = myList.Where(x => 
                              x.Length >= minChar && 
                              x.Length <= maxChar).ToList();
}
Run Code Online (Sandbox Code Playgroud)

任何计算单词的想法?

更新:这就像一个魅力...谢谢马修:

int minWords = int.Parse(numeric_MinWords.Text);
int maxWords = int.Parse(numeric_MaxWords.Text);

sortBox1 = sortBox1.Where(x => x.Trim().Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).Count() >= minWords &&
                               x.Trim().Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).Count() <= maxWords).ToList();
Run Code Online (Sandbox Code Playgroud)

c# ienumerable list word-count charactercount

5
推荐指数
1
解决办法
623
查看次数