标签: linq-to-objects

使用LINQ解析字符串中的数字

是否有可能编写一个查询,我们从任何给定的字符串中获取所有可以解析为int的字符?

例如,我们有一个字符串,如: "$%^DDFG 6 7 23 1"

结果必须是 "67231"

甚至更轻微一点:我们只能获得前三个数字吗?

c# linq string linq-to-objects c#-4.0

10
推荐指数
2
解决办法
9860
查看次数

什么是"现代"的方式来找到两个列表<T>对象中的常见项目?

我有一个包含两个不同类型泛型列表,例如着想,让他们打电话ProductsEmployees.我正在尝试找到与员工位于同一位置的产品,即在哪里product.SiteId == emp.SiteId

List<Product> lstProds;
List<Employees> lstEmps;
Run Code Online (Sandbox Code Playgroud)

我的(老skool)大脑告诉我使用forEach循环找到匹配但我怀疑有一个('更好'/更快/更快?)的方式来使用Linq.任何人都可以照亮我吗?我在网上找到的所有例子都涉及原语列表(字符串/整数),并没有特别有用.

c# linq linq-to-objects generic-list

10
推荐指数
1
解决办法
9477
查看次数

List <T> .Last()枚举集合吗?

考虑到List已知的边界,是否.Last()列举了集合?

我问这个,因为文件说,这是定义Enumerable(在这种情况下,需要枚举集)

如果它枚举集合,然后我可以通过索引只需访问最后一个元素(如我们知道.CountList<T>),但它似乎愚蠢不得不这样做....

.net c# collections linq-to-objects list

10
推荐指数
1
解决办法
288
查看次数

Linq to Objects链接哪个子句VS &&性能命中是微不足道的?

以下问题:
我应该在LINQ查询中使用两个"where"子句或"&&"吗?
可以或者我应该在LINQ查询中将两个Where子句连接在一起吗?
linq样式,链接where子句vs和运营商
Jon Skeet:博客文章

大多数答案都表示,Linq To Objects在单个lambda表达式中链接where子句vs && 的性能可以忽略不计,因此可以根据您的编码风格决定使用哪一个.

我从查看IL程序集开始,你可以肯定地看到chaining where子句将导致Where扩展被调用2次而第二次调用的输入是第一次调用的结果.

var numbers = new List<int>() { 1, 2 ,3,4,5,6,7,8,9,10};
IEnumerable<int> query = numbers.Where(x=> x>2).Where(x => x<5);
Run Code Online (Sandbox Code Playgroud)

// IL

IL_005B:  ldloc.0     // numbers
IL_005C:  ldsfld      UserQuery.CS$<>9__CachedAnonymousMethodDelegate3
IL_0061:  brtrue.s    IL_0076
IL_0063:  ldnull      
IL_0064:  ldftn       b__1
IL_006A:  newobj      System.Func<System.Int32,System.Boolean>..ctor
IL_006F:  stsfld      UserQuery.CS$<>9__CachedAnonymousMethodDelegate3
IL_0074:  br.s        IL_0076
IL_0076:  ldsfld      UserQuery.CS$<>9__CachedAnonymousMethodDelegate3
IL_007B:  call        System.Linq.Enumerable.Where <-----------First Call
IL_0080:  ldsfld      UserQuery.CS$<>9__CachedAnonymousMethodDelegate4
IL_0085:  brtrue.s    IL_009A
IL_0087:  ldnull      
IL_0088:  ldftn       b__2
IL_008E:  newobj      System.Func<System.Int32,System.Boolean>..ctor
IL_0093: …
Run Code Online (Sandbox Code Playgroud)

.net c# performance linq-to-objects

10
推荐指数
1
解决办法
1928
查看次数

为什么Enumerable.Empty()返回一个空数组?

我期望Enumerable.Empty()的实现就是这样:

public static IEnumerable<TResult> Empty<TResult>()
{
    yield break;
}
Run Code Online (Sandbox Code Playgroud)

但实现是这样的:

public static IEnumerable<TResult> Empty<TResult>()
{
    return EmptyEnumerable<TResult>.Instance;
}

internal class EmptyEnumerable<TElement>
{
    private static volatile TElement[] instance;

    public static IEnumerable<TElement> Instance
    {
        get
        {
            if (EmptyEnumerable<TElement>.instance == null)
                EmptyEnumerable<TElement>.instance = new TElement[0];
            return (IEnumerable<TElement>)EmptyEnumerable<TElement>.instance;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么实现比一行代码更复杂?返回缓存数组是否有优势而不是(yield)不返回任何元素?

注意:我永远不会依赖方法的实现细节,但我只是好奇.

c# linq linq-to-objects

10
推荐指数
1
解决办法
838
查看次数

C#对象排名,多个标准

我正在为我编写的局域网方网站构建一个插件,允许使用Round Robin锦标赛.

一切进展顺利,但我有一些关于排名超过两个标准的最有效方法的问题.

基本上,我想要以下排名布局:

         Rank  Wins  TotalScore
PersonE  1     5     50
PersonD  2     3.5   37
PersonA  2     3.5   37
PersonC  4     2.5   26
PersonB  5     2.5   24
PersonF  6     0     12
Run Code Online (Sandbox Code Playgroud)

在SQL服务器中,我会使用:

SELECT
    [Person],
    RANK() OVER (ORDER BY Wins DESC, TotalScore DESC) [Rank],
    [Wins],
    [TotalScore]
Run Code Online (Sandbox Code Playgroud)

现在,我只有List,Dictionary等可以使用

特别:

Dictionary<TournamentTeam, double> wins = new Dictionary<TournamentTeam, double>();
Dictionary<TournamentTeam, double> score = new Dictionary<TournamentTeam, double>();
Run Code Online (Sandbox Code Playgroud)

有没有办法用LINQ做这种排名风格?

如果没有,是否有一种可扩展的方式可以让我以后考虑Win-Loss-Draw而不仅仅是胜利,如果我选择的话?

编辑:

我改编了TheSoftwareJedi的答案:

private class RRWinRecord : IComparable
{
    public int Wins { get; set; } …
Run Code Online (Sandbox Code Playgroud)

c# linq linq-to-objects ranking

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

Linq Where子句 - 更好地堆叠或组合?

在为LINQ编写方法链时,我可以用两种方式之一做Where语句:

var blackOldCats = cats.Where(cat => cat.Age > 7 && cat.Colour == "noir" )
Run Code Online (Sandbox Code Playgroud)

要么

var blackOldCats = cats.Where(cat => cat.Age > 7).Where(cat => cat.Colour == "noir" )
Run Code Online (Sandbox Code Playgroud)

一个人比另一个人有什么好处吗?

不要过多担心这个例子中的数据类型,但是如果数据类型存在问题,那么也应该知道.

显而易见的一点是该对象已被引用,因此在应用程序中同时出现两个属性更容易,对吧?

c# linq-to-objects

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

如何在LINQ中学习查询

我衷心想要了解如何在c#中使用和不使用lambda表达式构建(简单和复杂)查询.我搜索了很多,但也许我可能会错过一些要检查的链接.有些人可以告诉我在哪里可以学习Linq的基本知识,它的所有功能,编写查询等等吗?请指导我!

c# linq-to-objects linq-to-xml linq-to-sql

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

使用Where.选择Linq

我有一个我必须使用的场景.选择LINQ中的位置.以下是我的查询.

List<DTFlight> testList = _ctrFlightList.Select(i => new DTFlight() { AirLineName = i.AirLineName,ArrivalDate = i.ArrivalDate }).ToList();
Run Code Online (Sandbox Code Playgroud)

我希望在这个查询中使用where(添加条件).

请帮忙......谢谢.

linq linq-to-objects

9
推荐指数
2
解决办法
5万
查看次数

此LINQ代码是否对原始数据执行多次查找?

我们在使用LINQ的代码段中遇到了轻微的性能问题,并且提出了一个关于LINQ如何在查找方面工作的问题

我的问题是这个(请注意我已经更改了所有代码,因此这是代码的指示性示例,而不是真实场景):

特定

public class Person {
 int ID;
 string Name;
 DateTime Birthday; 
 int OrganisationID;
}
Run Code Online (Sandbox Code Playgroud)

如果我有一个说100k Person对象的列表,然后是一个日期列表,比如1000,我运行了这段代码:

var personBirthdays = from Person p in personList
    where p.OrganisationID = 123
    select p.Birthday;

foreach (DateTime d in dateList)
{
    if (personBirthdays.Contains(d))
        Console.WriteLine(string.Format("Date: {0} has a Birthday", d.ToShortDateString()));
}
Run Code Online (Sandbox Code Playgroud)

结果代码将是以下迭代:

100k(用于查找具有organisationID 123的用户需要完成的循环)
乘以
1000(列表中的日期数量)
乘以
x(具有要检查的组织ID 123的用户数量的日期) )

这是很多迭代!

如果我将personBirthdays的代码更改为:

List<DateTime> personBirthdays = 
        (from Person p in personList
        where p.OrganisationID = 123
        select p.Birthday).ToList();
Run Code Online (Sandbox Code Playgroud)

这应该删除100k作为倍数,并只执行一次?

所以你会有100k +(1000*x)而不是(100k*1000*x).

问题是,这似乎太容易了,我确信LINQ在某个地方做了一些聪明的事情应该意味着这不会发生.

如果没有人回答,我会进行一些测试并报告.

清晰度更新: 我们不考虑数据库查找,该personList …

c# linq linq-to-objects

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