小编Had*_*adi的帖子

对多种方法使用相同的锁

到目前为止,我没有遇到任何问题使用相同的锁定多种方法,但我想知道以下代码是否可能确实存在我不知道的问题(性能?):

private static readonly object lockObj = new object();

public int GetValue1(int index)
{
    lock(lockObj)
    {
        // Collection 1 read and/or write
    }
}

public int GetValue2(int index)
{
    lock(lockObj)
    {
        // Collection 2 read and/or write
    }
}

public int GetValue3(int index)
{
    lock(lockObj)
    {
        // Collection 3 read and/or write
    }
}
Run Code Online (Sandbox Code Playgroud)

无论如何,3种方法和集合都没有关系.

另外,如果lockObj单例也使用它(在Instance属性中)会是一个问题吗?

编辑:澄清我在Singleton类中使用相同锁对象的问题:

private static readonly object SyncObject = new object();

public static MySingleton Instance
{
    get
    {
        lock (SyncObject)
        {
          if (_instance == …
Run Code Online (Sandbox Code Playgroud)

.net c# multithreading locking thread-safety

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

将水平条形图更改为垂直条形图

我正在为我的图表使用' System.Windows.Forms.DataVisualization.Charting '库,我想知道是否有人想出如何切换轴以垂直显示图表

谢谢.

替代文字

c# charts bar-chart

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

在C#中重构抽象类

对不起,如果这听起来很简单,但我正在寻找一些帮助来改善我的代码:)

所以我目前有以下实现(我也写过):

public interface IOptimizer
{
    void Optimize();
    string OptimizerName { get; }
}

public abstract AbstractOptimizer : IOptimizer
{
    public void Optimize()
    {
        // General implementation here with few calls to abstract methods
    }
}

public abstract AbstractPriorityOptimizer : AbstractOptimizer 
{
     // Optimize according to priority criteria.    

     string Name 
     { 
        get { return "Priority Optimizer"; }
     }      
}
Run Code Online (Sandbox Code Playgroud)

然后我有技术特定的具体课程:

TechnologyXPriorityOptimizer : AbstractPriorityOptimizer 
TechnologyYPriorityOptimizer : AbstractPriorityOptimizer 
Run Code Online (Sandbox Code Playgroud)


现在我正在尝试添加一个通用优化器,一个优化优先级以外的条件的优化器,所以我的尝试:

public abstract AbstractGenericOptimizer : AbstractOptimizer 
{
     // Optimize according to a generic criteria. …
Run Code Online (Sandbox Code Playgroud)

c# abstract-class design-patterns

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

用于生成多个模拟的设计模式是什么?

我有一个在特定高度和特定温度下运行的模拟:

interface IGeneratable
{
    string Name { get; }
    void Generate();
}    

interface ISimulation : IGeneratable
{
    int Height { get; }
    int Temperature { get; }        
}
Run Code Online (Sandbox Code Playgroud)

Generate()用于模拟典型的过程包括多个步骤:

void Generate()
{
    Step1();
    Step2();
    Step3();
}
Run Code Online (Sandbox Code Playgroud)

现在,用户可以指定多个高度和/或多个温度.

在这种情况下,产生多个模拟(子模拟),每个高度/温度组合一个.

interface IMultiSimulation : IGeneratable
{
    ISimulation[] SubSimulations { get; }       
}
Run Code Online (Sandbox Code Playgroud)

但是,在这种情况下,子模拟的Generate()方法与Step1,Step2,Step3顺序不同:

  • 如果指定了多个温度,则Step2()仅需要对所​​有子模拟执行一次,而不是每个温度执行一次(即每次多次模拟一次).
  • 如果指定了多个高度,则:
    • Step1() 首先为所有子模拟预先计算.
    • 然后执行步骤2,步骤3,......等.
  • 可以进行具有多个高度和多个温度的宏观模拟.这意味着需要满足上述2个标准.

一般注意事项

  • 步骤的实现被封装在IStep其中,实现IGeneratable.因此,模拟可以返回例如步骤列表.
  • 步数可以相当大.

我一直在尝试使用装饰模式,但没有成功.

我正在寻找一个适当的模式,其可扩展的解决方案可以处理单个模拟的生成以及多个模拟.

谢谢.

simulation design-patterns builder composite decorator

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

0-1背包算法

是否可以解决以下0-1背包问题:

  • '浮动'正值和
  • '浮动'权重(可以是正数或负数)
  • 背包的"漂浮"能力> 0

我平均有10个项目,所以我正在考虑使用暴力实施.但是,我想知道是否有更好的方法.

c# algorithm knapsack-problem dynamic-programming

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

锁定字典的TryGetValue() - 性能问题

我已经分析了我的应用程序并运行了一些性能测试,这使我相信以下if-lock-if安排:

private float GetValue(int id)
{
    float value;
    if (!dictionary.TryGetValue(id, out value))
    {
      lock (lockObj)
      {
        if (!dictionary.TryGetValue(id, out value))
        {
          value = ComputeValue(id);
          dictionary.Add(id, value);
        }
      }
    }
}
Run Code Online (Sandbox Code Playgroud)

似乎比"lock-if"或使用ReaderWriterLockSlim执行得更快.但很少,我得到以下异常:

1) Exception Information
*********************************************
Exception Type: System.NullReferenceException
Message: Object reference not set to an instance of an object.
Data: System.Collections.ListDictionaryInternal
TargetSite: Int32 FindEntry(TKey)
HelpLink: NULL
Source: mscorlib

StackTrace Information
*********************************************
  at System.Collections.Generic.Dictionary`2.FindEntry(TKey key)
  at System.Collections.Generic.Dictionary`2.TryGetValue(TKey key, TValue& value)
  at MyNamespace.GetValue()
  .....
  .....
Run Code Online (Sandbox Code Playgroud)

我在这做错了什么?

编辑:澄清一下,这种方法的平均调用次数超过5000万次,冲突一般不到5000次.

谢谢

c# performance dictionary locking

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

固定大小的集合,保留顶级(N)值

我的代码处理大量的值,我正在寻找一个有效的结构来跟踪顶部(N)值,其中N小于10,所以收集所有数字然后排序列表并取第一个(N)可能不是最有效的方式.

为此,我正在构建一个固定大小为N的集合,以保持顶部(N)值按降序排序.Add(T value)如果value高于任何现有值(在这种情况下删除最后一个元素)或者集合未满,则排序集合的方法会将值添加到集合中.

LinkedList<T>由于它具有快速插入和删除功能,因此我能够实现我想要的加倍,但我想知道使用SortedDictionary<TKey, TValue>或优先级队列是否会更好?

谢谢.

c# arrays sorting algorithm collections

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

RNGCryptoServiceProvider:生成[0,randomMax]范围内的随机数

我编写了以下代码来生成[0,int.MaxValue]范围内的随机数,但我不确定如何在保持均匀分布的同时将范围限制为[0,randomMax]:

private static int GetNextInt32(this RNGCryptoServiceProvider random)
{
  var buffer = new byte[sizeof(int)];
  random.GetBytes(buffer);
  return Math.Abs(BitConverter.ToInt32(buffer, 0));
}
Run Code Online (Sandbox Code Playgroud)

谢谢.

c# random

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

为Composite模式实现工厂

我有以下模拟数据:

interface ISimulationData
{
    string Name { get; }
    int[] Heights { get; }
    int[] Temperatures { get; }
}
Run Code Online (Sandbox Code Playgroud)

以下用于生成的界面:

interface ISimulation
{
    void Generate();
}
Run Code Online (Sandbox Code Playgroud)

使用Composite模式表示单个或多个模拟:

interface ISimpleSimulation : ISimulation
{
    int Height { get; }
    int Temperature { get; }
}

interface IMultiSimulation : ISimulation
{
    IEnumerable<ISimulation> GetSimulations();
}
Run Code Online (Sandbox Code Playgroud)

我有以下工厂界面:

interface ISimulationFactory
{
    ISimulation CreateSimulation(ISimulationData simulationData);
}
Run Code Online (Sandbox Code Playgroud)

模拟类型的具体实现:

class SimpleSimulation : ISimpleSimulation
{
    public int Height { get; set; }
    public int Temperature …
Run Code Online (Sandbox Code Playgroud)

.net design-patterns factory composite decorator

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

用于键值查找的更简单的数据结构?

对于一小组键/值对(默认值2,最大值为5),a Dictionary<TKey, TValue>似乎有点矫枉过正.是否有一个更简单的数据结构可以在我的情况下使用?我正在为某些对象(即<MyClass, double>)缓存计算值,因此检索速度很重要.

谢谢

c# memory lookup performance dictionary

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