标签: linq-to-objects

展平Linq Group查询

我有一个像这样的数据列表:

ID AddressPurpose Address ...
1  L
1  P
2  L
2  P
3  P
3  L
4  P
4  L
5  P
6  L
Run Code Online (Sandbox Code Playgroud)

我希望能够过滤数据,以便对于每个唯一的数字,如果有一个P行,则返回它,否则返回L行.所以数据看起来像这样:

ID AddressPurpose Address ...
1  P
2  P
3  P
4  P
5  P
6  L
Run Code Online (Sandbox Code Playgroud)

目前我有这个查询工作正常:

var query = from c in list
            orderby c.AddressPurpose descending
            group c by c.ID
            into g
                select g;

var finalList = new List<Company>();
foreach (var list in query)
{
    finalList.Add(list.First());
}
return finalList;
Run Code Online (Sandbox Code Playgroud)

没有使用额外的foreach,有没有更好的方法来做到这一点?

c# linq linq-to-objects group-by

8
推荐指数
2
解决办法
3366
查看次数

[优化此项]:慢速LINQ到对象查询

我有这个问题困扰着我; 它被封装为一个新的查询运算符,我制作了两个版本,试图看看哪个更好.两者表现得非常糟糕.

第一次尝试; 陈述式

public static IEnumerable<IEnumerable<?>> Section<?>(this IEnumerable<?> source, int length)
{
    return source.Any()
        ? source.Take(length).Cons(source.Skip(length).Section(length))
        : Enumerable.Empty<IEnumerable<?>>();
}
Run Code Online (Sandbox Code Playgroud)

第二次尝试:势在必行的"收益率回报"风格

public static IEnumerable<IEnumerable<?>> Section<?>(this IEnumerable<?> source, int length)
{
    var fst = source.Take(length);
    var rst = source.Skip(length);

    yield return fst;

    if (rst.Any())
        foreach (var section in rst.Section(length))
            yield return section;
}
Run Code Online (Sandbox Code Playgroud)

事实上,第二次尝试在可读性,组合性和速度方面都更糟糕.

关于如何优化这个的任何线索?

c# linq optimization performance linq-to-objects

8
推荐指数
2
解决办法
3279
查看次数

不区分大小写的字符串与linq-to-sql和linq-to-objects进行比较

另请参见LINQ to Objects和LINQ to SQL查询之间的差异

我们在数据库内存对象中使用了一些查询.

与linq-to-sql相比,使用不敏感字符串的最佳方法是什么?

  • 它在SQL Server上运行得很快
  • 相同的查询表达式可以与linq-to-objects一起使用以获得相同的结果

运用

a.ToLowerInvariant() == b.ToLowerInvariant()
Run Code Online (Sandbox Code Playgroud)

至少得到相同的结果,但据我所知,它不会在SQL服务器上处理,所以可能会慢得多

a == b
Run Code Online (Sandbox Code Playgroud)

.net linq linq-to-objects linq-to-sql

8
推荐指数
2
解决办法
3688
查看次数

何时LINQ(对象)过度使用?

我的职业生涯始于一个核心功能范式开发人员(LISP),现在我是一个核心的.net/C#开发人员.当然我很迷恋LINQ.但是,我也相信(1)使用正确的工具和(2)保留KISS原则:在我工作的60多名工程师中,可能只有20%有LINQ /功能范例经验,5%有6到12个月的这种经历.简而言之,我觉得有必要远离LINQ,除非我在没有它的情况下实现目标受到阻碍(其中用一行LINQ替换3行OO代码不是"目标").

但现在,拥有12个月LINQ /功能范例经验的工程师之一,正在生产代码中的每个可想到的位置使用LINQ到对象,或者至少使用lambda表达式.我对KISS原则的各种呼吁没有产生任何结果.因此...

我接下来可以申请哪些已发表的研究?什么"编码标准"指南有其他人炮制成功?我可以指出是否发布了LINQ性能问题?简而言之,我试图通过间接说服来实现我的第一个目标 - KISS.

当然,这个问题可以扩展到无数其他领域(例如过度使用扩展方法).也许有一个"超级"指南,备受推崇(例如已发表的研究等),在这方面需要更广泛的考虑.什么?

编辑编辑:哇!我受过教育!我同意我会以完全错误的方式来到这里.但作为澄清,请看下面我实际看到的示例代码.最初它编译和工作,但它的目的现在无关紧要.只要顺其自然的"感觉".现在我半年后再次访问这个样本,我对实际上困扰我的情况有了不同的看法.但是我希望有更好的眼睛比我的评论更好.

//This looks like it was meant to become an extension method...
public class ExtensionOfThreadPool
{
    public static bool QueueUserWorkItem(Action callback)
    {
        return ThreadPool.QueueUserWorkItem((o) => callback());
    }
}

public class LoadBalancer
{
    //other methods and state variables have been stripped...

    void ThreadWorker()
    {
        // The following callbacks give us an easy way to control whether
        // we add additional headers around outbound WCF calls.
        Action<Action> WorkRunner = null;

        // This …
Run Code Online (Sandbox Code Playgroud)

linq lambda linq-to-objects

8
推荐指数
2
解决办法
729
查看次数

如何在linq中使用IN运算符

我正在查询视图并使用名为status的列过滤结果.我想查询它,以便我可以通过使用IN运算符来搜索具有不同状态的行,就像我在SQL中所做的那样.

如此:

SELECT*FROM VIEW WHERE状态('....','.....')

我怎样才能做到这一点?

c# linq linq-to-objects

8
推荐指数
1
解决办法
7016
查看次数

谓词作为参数的方法

这是一个普遍的问题,但这是我正在寻找解决方案的具体案例:

我有一个Dictionary<int, List<string>>我想应用各种谓词.我想要一个可以处理多个LINQ查询的方法,例如:

from x in Dictionary
where x.Value.Contains("Test")
select x.Key

from x in Dictionary
where x.Value.Contains("Test2")
select x.Key
Run Code Online (Sandbox Code Playgroud)

所以我正在寻找一个像这样的方法:

public int GetResult(**WhatGoesHere** filter)
{
    return from x in Dictionary.Where(filter)
           select x.Key;
}
Run Code Online (Sandbox Code Playgroud)

要像这样使用:

int result;

result = GetResult(x => x.Value.Contains("Test"));
result = GetResult(x => x.Value.Contains("Test2"));
Run Code Online (Sandbox Code Playgroud)

WhatGoesHere的正确语法是什么

.net c# linq linq-to-objects predicate

8
推荐指数
1
解决办法
9121
查看次数

如何获取集合的空列表?

我有一个匿名类的集合,我想返回一个空列表.

什么是最好的可读表达式?

我虽然如下,但我认为它们不够可读:

var result = MyCollection.Take(0).ToList();

var result = MyCollection.Where(p => false).ToList();
Run Code Online (Sandbox Code Playgroud)

注意:我不想清空集合本身.

任何建议!

c# linq linq-to-objects

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

Linq to objects Predicate Builder

使用linq到对象(不是linq到sql)进行条件查询的最佳方法是什么.

目前我正在使用http://www.albahari.com/nutshell/predicatebuilder.aspx中的Predicate构建器 ,并将已编译的谓词传递给IEnumerable.Where,它似乎工作得很好.

我要解决的示例代码:

我有这个

 string keyword1 = "Test1";
 string keyword2 = "Test3";

        IEnumerable<TestObject> tests = new List<TestObject>()
                                     {
                                         new TestObject() {Name1 = "Test1", Name2 = "Test1"},
                                         new TestObject() {Name1 = "Test2", Name2 = "Test2"},
                                         new TestObject() {Name1 = "Test3", Name2 = "Test3"},

                                     };

        if (!String.IsNullOrEmpty(keyword1) && String.IsNullOrEmpty(keyword2))
            tests = tests.Where(e => e.Name1.Contains(keyword1));
        else if (!String.IsNullOrEmpty(keyword2) && !String.IsNullOrEmpty(keyword1))
            tests = tests.Where(e => e.Name2.Contains(keyword2) || e.Name1.Contains(keyword1));

        return tests.ToList();
Run Code Online (Sandbox Code Playgroud)

c# linq-to-objects

8
推荐指数
1
解决办法
2558
查看次数

检查列表中元素的更好方法是什么?

如果我想执行.Where(...)或.Max(...)等操作,我需要确保列表不为空并且计数大于零.每次我想使用列表时,除了执行以下操作之外:

if(mylist != null && mylist.Count > 0)
{...}
Run Code Online (Sandbox Code Playgroud)

我可以使用更内联或lambda技术吗?还是另一种压缩技术?

.net c# linq linq-to-objects

8
推荐指数
2
解决办法
1118
查看次数

使用linq从IEnumerable中排除类型

如何使用linq-to-objects基于派生类型过滤掉对象?

我正在寻找性能最佳的解决方案.

使用的类:

abstract class Animal { }
class Dog : Animal { }
class Cat : Animal { }
class Duck : Animal { }
class MadDuck : Duck { }
Run Code Online (Sandbox Code Playgroud)

我知道三种方法:使用is关键字,使用Except方法,并使用该OfType方法.

List<Animal> animals = new List<Animal>
{
    new Cat(),
    new Dog(),
    new Duck(),
    new MadDuck(),
};

// Get all animals except ducks (and or their derived types)
var a = animals.Where(animal => (animal is Duck == false));
var b = animals.Except((IEnumerable<Animal>)animals.OfType<Duck>());

// …
Run Code Online (Sandbox Code Playgroud)

c# linq linq-to-objects

8
推荐指数
1
解决办法
2088
查看次数