小编Rau*_*otz的帖子

类型可以同时是引用类型和值类型吗?

如果没有,并且引用类型和值类型的集合是互斥的,为什么不编译:

public static void Do<T>(T obj) where T : struct { }
public static void Do<T>(T obj) where T : class { }
Run Code Online (Sandbox Code Playgroud)

编译器声明:"Type已经定义了一个名为'Do'的成员,它具有相同的参数类型."但是T和T在这里不一样.一个是约束结构,另一个是类的约束.对函数的调用应该始终是可解析的.有反例吗?

c# type-systems

6
推荐指数
1
解决办法
83
查看次数

ReaderWriterLockSlim与Monitor

我有一个IDictionary<TKey,TValue>内部持有另一个的实现,Dictionary<TKey, TValue>并通过密钥的HashCode将插入分发到invidual子字典.有16个子词典,4核机器上的冲突数量相当低.

对于并行插入,我使用a锁定Add-method ReaderWriterLockSlim,仅锁定单个子字典:

  public void Add(TKey key, TValue value)
        {
            int poolIndex = GetPoolIndex(key);
            this.locks[poolIndex].EnterWriteLock();
            try
            {
                this.pools[poolIndex].Add(key, value);
            }
            finally
            {
                this.locks[poolIndex].ExitWriteLock();
            }
        }
Run Code Online (Sandbox Code Playgroud)

插入四个线程的项目时,我只有大约32%的CPU使用率和糟糕的性能.所以我用Monitor(即lock关键字)替换了ReaderWriterLockSlim .CPU使用率现在接近100%,性能提高了一倍多.

我的问题是:为什么CPU使用率会增加?碰撞次数不应该改变.是什么让ReaderWriterLock.EnterWriteLock等了这么多次?

c# multithreading locking readerwriterlock

5
推荐指数
1
解决办法
6317
查看次数

在Expression Trees中调用实例方法的最佳方法?

在表达式树中调用实例方法的最佳方法是什么?我目前的解决方案是接口IColumn的接口方法"对象GetRowValue(rowIndex)".

public static Expression CreateGetRowValueExpression(
    IColumn column, 
    ParameterExpression rowIndex)
        {
            MethodInfo methodInfo = column.GetType().GetMethod(
                "GetRowValue",
                BindingFlags.Instance | BindingFlags.Public,
                null,
                CallingConventions.Any,
                new[] { typeof(int) },
                null);
            var instance = Expression.Constant(column);
            return Expression.Call(instance, methodInfo, rowIndex);            
        }
Run Code Online (Sandbox Code Playgroud)

有更快的方法吗?是否可以创建表达式而无需将方法名称作为字符串传递(对于重构不好)?

c# linq expression-trees

4
推荐指数
1
解决办法
4981
查看次数

C#中的双向字典/地图

在.NET中是否存在一个有效存储键/值对的双向字典,其中键和值都是不同的,因此可以使用双射映射(即TryGetValue/TryGetKey)?天真的方法是拥有两个内部字典:键值和值键字典,但这在内存方面效率不高.

c# dictionary

4
推荐指数
2
解决办法
2880
查看次数

针对特殊分配问题的高效解决方案

鉴于:

- 一组项目,每个项目都有放入给定容器类型的成本.

- 一组容器类型,每个容器类型都有许多可用容器.

例:

金额*集装箱类型:5*A,3*B,2*C.

物品(成本):

3*X(A = 2,B = 3,C = 1)

2*Y(A = 5,B = 2,C = 2)

1*Z(A = 3,B = 3,C = 1)

问题:

找到物品放入容器的最佳位置,以便降低成本.为简单起见,仅将项目放入单一类型的容器中.

我尝试使用匈牙利方法来解决问题,但是运行时间为O(n³),对于大问题(例如,100000项)来说,这是非常令人望而却步的.

我目前的解决方案是一种贪婪的方法,只需按成本(asc)对项目 - 容器组合进行排序,并在O(n log n)中为第一个容器分配足够的数量.

有更好的解决方案吗?

algorithm variable-assignment

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

使用LinFu生成动态代理

我正在尝试为LinFu的接口构建动态代理.代理应该只实现接口定义的属性的getter方法,并返回例如字典中的值,其中键是属性名称.

链接文字

c# proxy dynamic linfu

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