我很难想出一个很好的方法来解释这个问题,所以让我试着通过例子来解释:
假设我有一些界面.为简单起见,我会说界面是IRunnable,它提供了一种方法Run.(这不是真实的;它只是一个例子.)
现在,假设我有一些预先存在的课程,让我们称之为Cheetah,我无法改变.它之前存在IRunnable; 我不能让它实现我的接口.但我想使用它就像它实现 - IRunnable可能因为它有一个Run方法,或类似的东西.换句话说,我希望能够拥有期望IRunnable和将使用的代码Cheetah.
好的,所以我总能写出CheetahWrapper一些交易.但幽默我,让我写一些更灵活的东西 - 怎么样RunnableAdapter?
我设想类定义是这样的:
public class RunnableAdapter : IRunnable {
public delegate void RunMethod();
private RunMethod Runner { get; set; }
public RunnableAdapter(RunMethod runner) {
this.Runner = runner;
}
public void Run() {
Runner.Invoke();
}
}
Run Code Online (Sandbox Code Playgroud)
直截了当,对吧?所以有了这个,我应该可以这样打个电话:
Cheetah c = new Cheetah();
RunnableAdapter ra = new RunnableAdapter(c.Run);
Run Code Online (Sandbox Code Playgroud)
现在,瞧,我有一个实现的对象,IRunner并且在其心中是一个Cheetah …
假设我有一个滚动的值集合,我指定集合的大小,并且每当添加新值时,超出此指定大小的任何旧值都将被删除.显然(我已经测试了这个)用于此行为的最佳集合类型是队列:
myQueue.Enqueue(newValue)
If myQueue.Count > specifiedSize Then myQueue.Dequeue()
Run Code Online (Sandbox Code Playgroud)
但是,如果我想计算队列中第一个和最后一个项目之间的差异怎么办?显然我无法通过索引访问项目.但是,从队列切换到实现IList的东西看起来有点矫枉过正,就像写一个新的类Queue类一样.现在我有:
Dim firstValue As Integer = myQueue.Peek()
Dim lastValue As Integer = myQueue.ToArray()(myQueue.Count - 1)
Dim diff As Integer = lastValue - firstValue
Run Code Online (Sandbox Code Playgroud)
那个叫ToArray()我困扰的电话,但是一个更好的选择不会来找我.有什么建议?
仅供将来参考,我将列出我所知道的所有可以在滚动集合中维护的统计信息,在每次添加/删除时重新计算为O(1)操作(这实际上是我应该如何从一开始就提出这个问题:
好的,所以更准确地说:这些不是我所知道的统计数据的"全部".他们就是我现在能记住的那些人.
*可以在O重新计算(1)仅增加,或者增加,如果集合排序清除(但在这种情况下,插入不是O(1)).对于未排序的集合,删除可能会导致O(n)重新计算.
**仅在O(1)中重新计算已排序的索引集合.
***需要相当复杂的数据结构才能在O(1)中重新计算.
****当以线性下降的方式指定权重时,当然可以在O(1)中实现添加和删除.在其他情况下,我不确定.
假设我维护一组数字数据 - 比方说,只是一堆数字.对于这些数据,可能有许多计算值; 一个例子是总和.为了得到所有这些数据的总和,我可以......
选项1:遍历集合,添加所有值:
double sum = 0.0;
for (int i = 0; i < values.Count; i++) sum += values[i];
Run Code Online (Sandbox Code Playgroud)
选项2:保持总和,无需迭代集合只是为了找到总和:
void Add(double value) {
values.Add(value);
sum += value;
}
void Remove(double value) {
values.Remove(value);
sum -= value;
}
Run Code Online (Sandbox Code Playgroud)
编辑:为了将这个问题放在更相关的术语中,让我们将上面的两个选项与(某种)现实世界的情况进行比较:
假设我开始大声列出数字并要求你把它们放在脑中.我先说"11,16,13,12".如果你只是记住这些数字本身而已,而且我说,"总和是多少?",你必须自己想一想,"好吧,11 + 16 + 13 + 12是什么?" 在回答之前,"52." 另一方面,如果你在列出数字的时候一直在跟踪金额(即,当我说"11"时你认为"11",当我说"16"时,你想,"27 …
对于那些没有时间阅读我对以下问题的推理的人:
有没有办法为方法的参数强制执行"仅新对象"或"仅现有对象"的策略?
有很多方法将对象作为参数,并且方法是否具有对象"all to their"并不重要.例如:
var people = new List<Person>();
Person bob = new Person("Bob");
people.Add(bob);
people.Add(new Person("Larry"));
Run Code Online (Sandbox Code Playgroud)
这里该List<Person>.Add方法采用了"现有" Person(Bob)以及"新" Person(Larry),并且该列表包含两个项目.鲍勃可以作为被访问bob或people[0].Larry可以作为people[1]并且如果需要,可以在larry此后作为(或其他)进行缓存和访问.
好的.但有时一个方法确实不应该传递给新对象.举个例子吧Array.Sort<T>.以下内容并没有多大意义:
Array.Sort<int>(new int[] {5, 6, 3, 7, 2, 1});
Run Code Online (Sandbox Code Playgroud)
所有上面的代码都是采用一个新的数组,对它进行排序,然后忘记它(因为它的引用计数在Array.Sort<int>退出后达到零,因此排序的数组将被垃圾收集,如果我没有记错的话).因此,Array.Sort<T> 期望 "现有"数组作为其参数.
可以想象有其他方法可以期待 "新"对象(尽管我通常认为这样的期望会是设计错误).一个不完美的例子是:
DataTable firstTable = myDataSet.Tables["FirstTable"];
DataTable secondTable = myDataSet.Tables["SecondTable"];
firstTable.Rows.Add(secondTable.Rows[0]);
Run Code Online (Sandbox Code Playgroud)
正如我所说,这不是一个很好的例子,因为DataRowCollection.Add实际上并没有真正期待一个新的 DataRow,确切的; 但它确实期望一个DataRow不属于a的DataTable.所以上面代码中的最后一行不起作用; …
什么是用VB.NET编写的好库?最好的是开源,因为这将允许感兴趣的开发人员看一些好的VB.NET代码,看看如何有效地使用该语言.但我有兴趣知道任何图书馆,特别是有信誉的图书馆.
一般来说,当比较VB.NET和C#时,对C#有很多强大的支持,伴随着对VB.NET的一些抨击,直到一个受人尊敬的开发人员出现并充当The Voice Of Reason,指出虽然VB 优先对于VB.NET有相当多的问题,VB.NET实际上是一个非常强大的,完全OOP语言,功能明智,与C#同等(除了某些东西,如一个浓郁的lamba语法) [pre-VB10]或yield关键字,很多C#忠实用户都很快指出).
我自己,在VB.NET和C#中编写了大量代码,完全属于"我更喜欢C#,但不要把VB.NET视为一种语言"阵营.但是,我注意到的一件事是,当涉及到.NET的受尊重和/或广泛使用的库时,每个都是用C#编写的.或者至少那是我的印象.这让我觉得有点奇怪,因为除了上面提到的很好的功能(特别是yield关键字)之外,我倾向于将VB.NET/C#分为主要是个人品味的问题.显然,很多开发人员更喜欢C#.但我个人认识一些喜欢VB.NET的开发人员(好人),这会让我怀疑肯定会有一些库(好的)用 VB.NET 编写.
我认为他们必须在那里,我只是没有找到它们.
是否有一种标准方法可以"干净地"关闭应用程序,而某些WaitHandle对象可能处于当前阻塞调用的状态WaitOne?
例如,可能有一个后台线程在这样的方法中旋转:
while (_request.WaitOne())
{
try
{
_workItem.Invoke();
}
finally
{
OnWorkCompleted();
}
}
Run Code Online (Sandbox Code Playgroud)
我没有看到没有明显的方法来处理这个线程而没有调用Thread.Abort(根据我的理解,这是不鼓励的).调用Close了对_request对象(AutoResetEvent),但是,会抛出异常.
目前,运行此循环的线程已将其IsBackground属性设置为true,因此应用程序似乎正常关闭.但是,自从WaitHandle实现以来IDisposable,我不确定这是否被认为是犹太洁食,或者是否应该在应用程序退出之前处理该对象.
这是一个糟糕的设计吗?如果没有,通常如何处理这种情况?
当我使用C#在Visual Studio中开发Windows窗体应用程序时,我添加到窗体的每个控件都默认标记为private,这就是我想要的.
使用VB.NET时,默认情况下每个控件都标记为Friend(相当于internalC#),这不是我想要的.
我可以更改此默认值吗?看起来肯定是某个地方的设置.
vb.net visual-studio-2008 windows-forms-designer visual-studio
我得到了一个trie背后的概念.但是在实施方面我有点困惑.
我认为构建Trie类型最明显的方法是Trie维护内部Dictionary<char, Trie>.事实上,我已经用这种方式编写了一个,并且它可以工作,但是......这看起来有点过分了.我的印象是trie应该是轻量级的,并且每个节点都有一个单独的Dictionary<char, Trie>对我来说似乎不是很轻量级.
有没有更合适的方法来实现我缺少的这种结构?
更新:好的!基于Jon和leppie的非常有用的输入,这是我到目前为止所提出的:
(1)我有Trie类型,它有一个_nodes类型的私有成员Trie.INodeCollection.
(2)Trie.INodeCollection界面有以下成员:
interface INodeCollection
{
bool TryGetNode(char key, out Trie node);
INodeCollection Add(char key, Trie node);
IEnumerable<Trie> GetNodes();
}
Run Code Online (Sandbox Code Playgroud)
(3)此接口有三种实现方式:
class SingleNode : INodeCollection
{
internal readonly char _key;
internal readonly Trie _trie;
public SingleNode(char key, Trie trie)
{ /*...*/ }
// Add returns a SmallNodeCollection.
}
class SmallNodeCollection : INodeCollection …Run Code Online (Sandbox Code Playgroud) 根据StringComparer.OrdinalIgnoreCase属性的MSDN文档:
OrdinalIgnoreCase属性实际上返回从StringComparer类派生的匿名类的实例.
这是一个我不熟悉的功能 - 带继承的匿名类型吗?或者通过"匿名类",作者只是意味着"内部类派生自StringComparer客户端代码不可见"?
显然,问题的答案取决于许多环境因素.
在一般的,我想知道是什么人的经验与HtmlUnitDriver作为一个可靠的工具,它可以是"信任"来浏览网站基本相同的方式其他浏览器做.
当然,我意识到"其他浏览器的做法"非常模糊; 自然每个浏览器都会有它的怪癖.但我正处于一个项目中,我们有数百个验收测试场景(用JBehave编写)并且使用FirefoxDriver和InternetExplorerDriver运行它们所需的时间超过两个小时,从持续集成的角度来看,这有点粗糙.所以我想知道我们是否可以将我们的验收测试转换为使用并且期望更快的时间与大多数相同的行为是至少可行的(也许我们可以预期一些测试失败使用并专门运行那些测试基于浏览器的驱动程序).HtmlUnitDriverHtmlUnitDriver
我们的UI使用GWT,这可能会或可能不会使事情复杂化(我不知道).
基本上,在其他人的体验中,它的HtmlUnitDriver运行方式和其他浏览器一样,或者它是否真的只适用于使用最少JavaScript的非常简单的HTML网站,不应该用于企业Web应用程序?
.net ×6
c# ×6
vb.net ×3
collections ×1
delegates ×1
dictionary ×1
gwt ×1
htmlunit ×1
idisposable ×1
iteration ×1
math ×1
new-operator ×1
open-source ×1
parameters ×1
queue ×1
reference ×1
reliability ×1
shutdown ×1
statistics ×1
trie ×1
waithandle ×1
webdriver ×1