作为一名新的.NET 3.5程序员,我开始学习LINQ,我发现了一些非常基本的东西,我之前没有注意到:
本书声称每个数组实现IEnumerable<T>(显然,否则我们不能使用LINQ到数组上的对象......).当我看到这个时,我心里想,我从未真正想过这个,我问自己所有数组实现了什么 - 所以我检查了
System.Array使用对象浏览器(因为它是CLR中每个数组的基类),并且我很惊讶,它没有实现IEnumerable<T>.
所以我的问题是:定义在哪里?我的意思是,我怎么能准确地告诉每个阵列实现哪些接口?
考虑以下代码:
var query = db.Table
.Where(t => SomeCondition(t))
.AsEnumerable();
int recordCount = query.Count();
int totalSomeNumber = query.Sum();
decimal average = query.Average();
Run Code Online (Sandbox Code Playgroud)
假设query需要很长时间才能运行.我需要获得记录数,总数SomeNumber已经返回,并在结束时取平均值.我以为根据我读的是.AsEnumerable()将执行使用LINQ到SQL,然后使用LINQ到对象的查询Count,Sum以及Average.相反,当我在LINQPad中执行此操作时,我看到相同的查询运行三次.如果我更换.AsEnumerable()用.ToList(),它只被查询一次.
我错过了什么AsEnumerable/做什么?
所以我有一个structs 的集合(它实际上是一个WCF datacontract,但我认为这里没有任何影响).
List<OptionalExtra> OptionalExtras;
Run Code Online (Sandbox Code Playgroud)
OptionalExtra是一个struct.
public partial struct OptionalExtra
Run Code Online (Sandbox Code Playgroud)
现在我正在运行以下声明:
OptionalExtra multiOptExtra = OptionalExtras.Where(w => w.Code == optExtra.Code).FirstOrDefault();
if (multiOptExtra != null)
{
}
Run Code Online (Sandbox Code Playgroud)
现在这不会编译:
operator!=不能应用于OptionalExtra类型的opperands
'<null>'
经过一番谷歌搜索,我意识到这是因为OptionalExtra是struct.除非定义为可空类型,否则我认为不可为空?
所以我的问题是,如果我的where陈述没有结果,那么这个FirstOrDefault电话的结果会是什么?它会引发异常吗?
这不应该发生,但比抱歉更安全.
在 .NET<5 和 .NET Core 3.1 中,以下代码
var d = new Dictionary<string, int> { { "a", 0 }, { "b", 0 }, { "c", 0 } };
foreach (var k in d.Keys)
{
d[k]+=1;
}
Run Code Online (Sandbox Code Playgroud)
投掷
System.InvalidOperationException:集合已修改;枚举操作可能无法执行。
当面向 .NET 5 时,代码段不再抛出。
发生了什么变化?
我未能在Breaking changes in .NET 5和Performance Improvements in .NET 5 中找到答案。
是不是和什么有关ref readonly T?
谁能告诉我,哪一个是之间更有效的List<int>和int[].因为我正在研究一个项目,你可能知道效率是如此重要的关注点.
如果您在帖子中添加了一些介绍性说明,那就太棒了:)
我正在使用.Net 3.5(C#),我听说C#的性能List<T>.ToArray"糟糕",因为它为所有元素的内存副本形成了一个新的数组.真的吗?
我有两个字符串集合:CollectionA是存储在系统中的对象的StringCollection属性,而CollectionB是在运行时生成的List.如果存在任何差异,CollectionA需要更新以匹配CollectionB.所以我设计了我期望的一个简单的LINQ方法来执行删除.
var strDifferences = CollectionA.Where(foo => !CollectionB.Contains(foo));
foreach (var strVar in strDifferences) { CollectionA.Remove(strVar); }
Run Code Online (Sandbox Code Playgroud)
但我"Collection was modified; enumeration operation may not execute"在strDifferences上收到错误...即使它是一个与被修改的集合中的单独枚举!我最初明确地设计了这个来逃避这个错误,因为我的第一个实现会产生它(因为我在列举CollectionA并且只是删除时!CollectionB.Contains(str)).谁能解释为什么这个枚举失败了?
我有这样的代码:
void Foobar(string[] arr, Dictionary<string, string[]>)
{
var t = arr.Intersect(dic.Keys).ToList(); // .or ToArray() ?
foreach(var item in t)
{
..
}
var j = t.Count; // also I need this
}
Run Code Online (Sandbox Code Playgroud)
哪种方法更受欢迎?
我可以没有任何东西,但我需要知道大小,我不想打电话Enumerable.Count<T>()- 似乎做了更多的行动然后Array<T>.Size或List<T>.Count.我对吗?
这对我来说很容易在TSQL中执行,但我只是坐在这里,试着让它在EF4中工作!
我有一个表,我们称之为TestData.它有字段,比如:DataTypeID,Name,DataValue.
DataTypeID, Name, DataValue
1,"Data 1","Value1"
1,"Data 1","Value2"
2,"Data 1","Value3"
3,"Data 1","Value4"
Run Code Online (Sandbox Code Playgroud)
我想对DataID/Name进行分组,并将DataValue连接成CSV字符串.期望的结果应包含 -
DataTypeID, Name, DataValues
1,"Data 1","Value1,Value2"
2,"Data 1","Value3"
3,"Data 1","Value4"
Run Code Online (Sandbox Code Playgroud)
现在,我正在努力做到这一点 -
var query = (from t in context.TestData
group h by new { DataTypeID = h.DataTypeID, Name = h.Name } into g
select new
{
DataTypeID = g.Key.DataTypeID,
Name = g.Key.Name,
DataValues = (string)g.Aggregate("", (a, b) => (a != "" ? "," : "") + b.DataValue),
}).ToList()
Run Code Online (Sandbox Code Playgroud)
问题是LINQ to Entities不知道如何将其转换为SQL.这是3个LINQ查询联合的一部分,我真的希望它保持这种方式.我想我可以检索数据,然后再执行聚合.出于性能原因,这对我的应用程序无效.我还考虑过使用SQL服务器功能.但这在EF4世界中似乎并不"正确".
有人在乎这个问题吗?
我承认我并没有尝试对此进行基准测试,但我很好奇......
Enumerable.ToArray<T>(和它的堂兄Enumerable.ToList<T>)的CPU /内存特性是什么?
既然IEnumerable不预先通告它有多少元素,我(可能是天真地)假定ToArray必须"猜测"一个初始数组大小,然后如果第一个猜测看起来太小则重新调整/重新分配数组,然后调整大小如果第二次猜测看起来太小等等,它又会再次出现......这会产生比线性更差的性能.
我可以想象更好的方法涉及(混合)列表,但这仍然需要多个分配(虽然不是重新分配)和相当多的复制,尽管它可能是线性整体尽管开销.
幕后是否有任何"神奇"发生,避免了重复调整大小的需要,并ToArray在空间和时间上呈线性?
更一般地说,是否有关于BCL性能特征的"官方"文档?
c# ×9
linq ×5
.net ×4
performance ×3
arrays ×2
list ×2
.net-5 ×1
aggregate ×1
c#-4.0 ×1
enumeration ×1
ienumerable ×1
linq-to-sql ×1
memory ×1
struct ×1