Tag: 懒惰评估

使用MEF进行线程安全延迟实例化

// Member Variable private static readonly object _syncLock = new object(); // Now inside a static method foreach (var lazyObject in plugins) { if ((string)lazyObject.Metadata[“key”] = “something”) { lock (_syncLock) { // It seems the `IsValueCreated` is not up-to-date if (!lazyObject.IsValueCreated) lazyObject.value.DoSomething(); } return lazyObject.value; } } 在这里,我需要每个循环同步访问。 有很multithreading迭代这个循环,并根据它们正在寻找的key ,创建并返回一个惰性实例。 lazyObject应该lazyObject创建lazyObject 。 虽然Lazy类是这样做的,尽管使用了锁,但在高线程下我创建了多个实例(我在一个volatile static int上使用Interlocked.Increment跟踪它并将其记录到某处)。 […]

试图了解linq / deferred执行的工作原理

我有以下方法,这是执行分层k折交叉validation的逻辑的一部分。 private static IEnumerable<IEnumerable> GenerateFolds( IClassificationProblemData problemData, int numberOfFolds) { IRandom random = new MersenneTwister(); IEnumerable values = problemData.Dataset.GetDoubleValues(problemData.TargetVariable, problemData.TrainingIndices); var valuesIndices = problemData.TrainingIndices.Zip(values, (i, v) => new { Index = i, Value = v }); IEnumerable<IEnumerable<IEnumerable>> foldsByClass = valuesIndices.GroupBy(x => x.Value, x => x.Index) .Select(g => GenerateFolds(g, g.Count(), numberOfFolds)); var enumerators = foldsByClass.Select(x => […]

实现“LazyProperty”类 – 这是一个好主意吗?

我经常发现自己正在编写一个懒惰评估的属性。 就像是: if (backingField == null) backingField = SomeOperation(); return backingField; 代码不多,但如果你有很多属性,它会重复很多。 我正在考虑定义一个名为LazyProperty的类: public class LazyProperty { private readonly Func getter; public LazyProperty(Func getter) { this.getter = getter; } private bool loaded = false; private T propertyValue; public T Value { get { if (!loaded) { propertyValue = getter(); loaded = true; } return propertyValue; […]

nest产生以懒惰评估返回IEnumerable <IEnumerable >

我写了一个类似于String.Split的LINQ扩展方法String.Split 。 > new List(){3,4,2,21,3,2,17,16,1} > .SplitBetween(x=>x>=10) [3,4,2], [3,2], [], [1] 资源: // partition sequence into sequence of contiguous subsequences // behaves like String.Split public static IEnumerable<IEnumerable> SplitBetween(this IEnumerable source, Func separatorSelector, bool includeSeparator = false) { var l = new List(); foreach (var x in source) { if (separatorSelector(x)) { if (includeSeparator) { l.Add(x); […]

如何在最终确定静态变量之前得到通知

我什么时候可以清理存储在C#中的静态变量中的对象? 我有一个懒惰的初始化静态变量: public class Sqm { private static Lazy _default = new Lazy(); public static Sqm Default { get { return _default.Value; } } } 注意 :我刚刚将Foo改为static类。 如果Foo是静态的,它不会以任何方式改变问题。 但有些人确信,如果不先构建一个Foo实例,就不可能构造一个Sqm实例。 即使我确实创建了一个Foo对象; 即使我创建了100个,它也无法解决问题(何时“清理”静态成员)。 样品用法 Foo.Default.TimerStart(“SaveQuestion”); //…snip… Foo.Default.TimerStop(“SaveQuestion”); 现在,我的Sqm类实现了一个方法,当不再需要该对象时必须调用该方法,并且需要自行清理(将状态保存到文件系统,释放锁等)。 必须在垃圾收集器运行之前调用此方法(即在调用对象的终结器之前): public class Sqm { var values = new List(); Boolean shutdown = false; protected void Cleanup(ICollection stuff) { […]