IDictionary<TKey, TValue>继承自IEnumerable<KeyValuePair<TKey, TValue>>,但IDictionary由于某种原因不继承IEnumerable<DictionaryEntry>.我想知道为什么?.OfType<DictionaryEntry>()每当我需要对一个查询进行查询时,我讨厌写这个丑陋的IDictionary.
此链接解释了Encoder.GetBytes方法,并且还有一个名为flush的bool参数.冲洗的解释是:
如果此编码器在转换结束时可以刷新其状态,则为true;否则为false.否则,错误.为了确保正确终止一系列编码字节块,最后一次调用GetBytes可以为flush指定一个值true.
但是我不明白同花顺是做什么的,也许我喝醉了或者是某事:).请你详细解释一下.
我用NodaTime做时区转换在ical.net,因为它的性能比以前的实现它试图用更好的VTIMEZONE元素来处理时间的变化和时区转换。
在幕后,这种方法对性能非常重要:它将测试套件运行时间从大约 6 秒降低到大约 2.5 秒。
public static DateTimeZone GetZone(string tzId)
{
// IANA lookup attempt
zone = DateTimeZoneProviders.Bcl.GetZoneOrNull(tzId);
if (zone != null)
{
return zone;
}
// Serialization lookup attempt
// Some other tricks to find a reasonable time zone, etc.
}
Run Code Online (Sandbox Code Playgroud)
NodaTime 的 .NET Core 实现没有Bcl作为DateTimeZoneProvider. (它仍然有Tzdb和Serialization。)我在 NodaTime 源代码中摸索了一下,但我不确定替换是什么,如果有的话。
我们应该在 NodaTime 的 .NET Core 端口中使用什么进行 BCL 时区查找?
我知道Dictionary<K,V>.TryAdd().NET Core 2.0 中添加的方法通过在添加元素之前仅检查一次字典是否包含键来提高性能,这与以下方法不同:
if(!dico.ContainsKey(key)) { dico.Add(key,val); } // .Add() calls ContainsKey() a second time
Run Code Online (Sandbox Code Playgroud)
但是出于性能原因,我只想val在以下情况下才进行延迟构建!dico.ContainsKey(key):
if(!dico.ContainsKey(key)) { dico.Add(key, new Value()); }
Run Code Online (Sandbox Code Playgroud)
在这种情况下TryAdd(),由于该值不是延迟构建的,因此会降低性能。
dico.TryAdd(key,new Value());
Run Code Online (Sandbox Code Playgroud)
有没有办法既进行一次ContainsKey()调用又延迟构建值?就像是AddWithNoContainsKeyCheck():
if(!dico.ContainsKey(key)) { dico.AddWithNoContainsKeyCheck(key, new Value()); }
Run Code Online (Sandbox Code Playgroud) 我正在做一个项目,在某个时刻我需要显示一个月的时间,这些天仍然可用。有一个功能可以计算哪些日期可用。我的同事说:“哦,我们知道,您应该返回a BitVector32。这是使用布尔值列表时最有效的方法。” 我会用一个List<bool>或类似的东西。BitVector32在您实际使用位时,对我而言,A 似乎是低级内容。
所以,问题是。您是否应该BitVector32在需要少于32个布尔值的布尔值列表时使用Every,还是仅将其用于低级内容?
由于不可变数据结构是一等值,我们可以像处理任何其他值一样比较它们的相等性或顺序。但是在 BCL 不可变集合预览中事情变得复杂,因为每个不可变集合都可以由IEqualityComparer<T>/IComparer<T>实例参数化。看起来不应该允许具有不同比较器的不可变集合进行比较(因为比较器本身没有定义相等性),因为它使相等关系非对称:
var xs = ImmutableList<string>.Empty.Add("AAA")
.WithComparer(StringComparer.OrdinalIgnoreCase);
var ys = ImmutableList<string>.Empty.Add("aaa")
.WithComparer(StringComparer.Ordinal);
Console.WriteLine(xs.Equals(ys)); // true
Console.WriteLine(ys.Equals(xs)); // false
Run Code Online (Sandbox Code Playgroud)
这种行为会以某种方式修复吗?
c# immutability base-class-library data-structures immutable-collections
在过去,我们可以使用大括号方便地初始化可变集合,如下例所示:
var myDictionary = new Dictionary<string, decimal> {{"hello", 0m}, {"world", 1m}};
Run Code Online (Sandbox Code Playgroud)
是否有类似的语法可以与BCL不可变集合一起使用?我知道它仍然是预发布版但可能有推荐的语法,或者至少这个问题将作为实现这些方便的初始化器的反馈.
与此同时,我发现的最短时间如下:
var myDictionary = new Dictionary<string, decimal> {{"hello", 0m}, {"world", 1m}}.ToImmutableDictionary();
Run Code Online (Sandbox Code Playgroud) c# collections initialization immutability base-class-library
在F#中:
[0] = [0] = true
Run Code Online (Sandbox Code Playgroud)
在C#或.NET BCL中一般:
StructuralComparisons.Equals(new int[] { 0 }, new int[] { 0 }) == false
Run Code Online (Sandbox Code Playgroud)
为什么?
后记:
我认为我有"正确"等于的原因是因为事实证明这是真的:
var a = new { X = 3, Y = new { Z = -1 } };
var b = new { X = 3, Y = new { Z = -1 } };
StructuralComparisons.Equals(a, b) == true;
Run Code Online (Sandbox Code Playgroud) 我遇到了跨装配/朋友装配类型可见性的问题.
我有以下程序(我签名/强名).它告诉Castle DynamicProxy(我使用的是Castle.CoreNuGet包的4.2.1版)为我的界面创建一个代理IFoo.我还指定我internal class InterfaceProxyBase应该是代理类型的基类.
然后DynamicProxy System.Reflection.Emit用于创建代理类型.但显然,System.Reflection.Emit.TypeBuilder无法访问InterfaceProxyBase.
// [assembly: InternalsVisibleTo("?")]
// ^^^
// What do I need here for my program to work both on the .NET Framework 4.5+
// and on .NET Core / .NET Standard 1.3+?
using Castle.DynamicProxy;
class Program
{
static void Main()
{
var generator = new ProxyGenerator();
var options = new ProxyGenerationOptions
{
BaseTypeForInterfaceProxy = typeof(InterfaceProxyBase) // <--
};
var proxy = generator.CreateInterfaceProxyWithoutTarget(
typeof(IFoo), …Run Code Online (Sandbox Code Playgroud) .net castle-dynamicproxy internalsvisibleto base-class-library .net-core
如果我用来XDocument.Load解析 XML 文件...
var x = XDocument.Load("somefile.xml");
Run Code Online (Sandbox Code Playgroud)
...没有标题<?xml version="1.0" encoding="..."?>...
<MyRootElement>
...
</MyRootElement>
Run Code Online (Sandbox Code Playgroud)
...假定的默认编码是什么XDocument.Load?ANSI(即系统默认的旧语言环境)?UTF-8?还有别的事吗?
c# ×7
.net ×6
.net-core ×2
immutability ×2
bitvector ×1
boolean ×1
collections ×1
dictionary ×1
f# ×1
generics ×1
idictionary ×1
ienumerable ×1
nodatime ×1
timezone ×1
vb.net ×1
xml ×1