相关疑难解决方法(0)

所有数组在C#中实现了哪些接口?

作为一名新的.NET 3.5程序员,我开始学习LINQ,我发现了一些非常基本的东西,我之前没有注意到:

本书声称每个数组实现IEnumerable<T>(显然,否则我们不能使用LINQ到数组上的对象......).当我看到这个时,我心里想,我从未真正想过这个,我问自己所有数组实现了什么 - 所以我检查了 System.Array使用对象浏览器(因为它是CLR中每个数组的基类),并且我很惊讶,它没有实现IEnumerable<T>.

所以我的问题是:定义在哪里?我的意思是,我怎么能准确地告诉每个阵列实现哪些接口?

.net c# arrays interface-implementation

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

我误解了LINQ to SQL .AsEnumerable()?

考虑以下代码:

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/做什么?

.net c# linq linq-to-sql

49
推荐指数
3
解决办法
1万
查看次数

FirstOrDefault()结果集合的结果?

所以我有一个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>'

经过一番谷歌搜索,我意识到这是因为OptionalExtrastruct.除非定义为可空类型,否则我认为不可为空?

所以我的问题是,如果我的where陈述没有结果,那么这个FirstOrDefault电话的结果会是什么?它会引发异常吗?

不应该发生,但比抱歉更安全.

linq struct c#-4.0

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

.net 5 中的更改使其在更改 foreach 中的字典值时不会抛出

在 .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 5Performance Improvements in .NET 5 中找到答案。

是不是和什么有关ref readonly T

c# .net-5

33
推荐指数
1
解决办法
1584
查看次数

哪一个更有效:List <int>或int []

谁能告诉我,哪一个是之间更有效的List<int>int[].因为我正在研究一个项目,你可能知道效率是如此重要的关注点.

如果您在帖子中添加了一些介绍性说明,那就太棒了:)

c# list

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

C#List <T> .ToArray表现不好?

我正在使用.Net 3.5(C#),我听说C#的性能List<T>.ToArray"糟糕",因为它为所有元素的内存副本形成了一个新的数组.真的吗?

.net c# memory performance

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

为什么我没有修改枚举集合时"收集被修改;枚举操作可能无法执行"?

我有两个字符串集合: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)).谁能解释为什么这个枚举失败了?

c# linq enumeration

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

我需要迭代和计数.什么是最快或首选:ToArray()或ToList()?

可能重复:
在LINQ查询中调用ToList()或ToArray()会更好吗?

我有这样的代码:

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>.SizeList<T>.Count.我对吗?

c# arrays performance ienumerable list

17
推荐指数
3
解决办法
1万
查看次数

使用LINQ聚合的实体框架来连接字符串?

这对我来说很容易在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世界中似乎并不"正确".

有人在乎这个问题吗?

c# linq aggregate entity-framework-4

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

C#:ToArray表现

背景:

我承认我并没有尝试对此进行基准测试,但我很好奇......

Enumerable.ToArray<T>(和它的堂兄Enumerable.ToList<T>)的CPU /内存特性是什么?

既然IEnumerable不预先通告它有多少元素,我(可能是天真地)假定ToArray必须"猜测"一个初始数组大小,然后如果第一个猜测看起来太小则重新调整/重新分配数组,然后调整大小如果第二次猜测看起来太小等等,它又会再次出现......这会产生比线性更差的性能.

我可以想象更好的方法涉及(混合)列表,但这仍然需要多个分配(虽然不是重新分配)和相当多的复制,尽管它可能是线性整体尽管开销.

题:

幕后是否有任何"神奇"发生,避免了重复调整大小的需要,并ToArray在空间和时间上呈线性?

更一般地说,是否有关于BCL性能特征的"官方"文档?

.net c# linq performance

13
推荐指数
2
解决办法
7175
查看次数