小编Sup*_*est的帖子

为什么不从List <T>继承?

在规划我的程序时,我经常从一连串的想法开始:

足球队只是一个足球运动员名单.因此,我应该代表它:

var football_team = new List<FootballPlayer>();
Run Code Online (Sandbox Code Playgroud)

此列表的顺序表示球员在名单中列出的顺序.

但我后来才意识到,除了仅仅是球员名单之外,球队还有其他属性,必须记录下来.例如,本赛季的总得分,当前预算,统一颜色,string代表球队名称等等.

那么我认为:

好吧,足球队就像一个球员名单,但另外,它有一个名称(a string)和一个总分(a int)..NET不提供用于存储足球队的类,所以我将创建自己的类.最相似和相关的现有结构是List<FootballPlayer>,所以我将继承它:

class FootballTeam : List<FootballPlayer> 
{ 
    public string TeamName; 
    public int RunningTotal 
}
Run Code Online (Sandbox Code Playgroud)

但事实证明,指南说你不应该继承List<T>.我在两个方面完全被这个指南搞糊涂了.

为什么不?

显然List是以某种方式针对性能进行了优化.怎么会这样?如果我延长会给我带来什么性能问题List?究竟会打破什么?

我看到的另一个原因List是微软提供的,我无法控制它,所以我在以后暴露"公共API"后无法改变它.但我很难理解这一点.什么是公共API,我为什么要关心?如果我当前的项目没有并且不太可能拥有此公共API,我可以放心地忽略此指南吗?如果我继承List 并且事实证明我需要一个公共API,那么我将遇到什么困难?

为什么它甚至重要?列表是一个列表.什么可能改变?我可能想要改变什么?

最后,如果微软不想让我继承List,他们为什么不上课sealed呢?

我还应该使用什么呢?

显然,对于自定义集合,Microsoft提供了一个Collection应该扩展的类而不是List.但这个类是非常裸露,并没有多少有用的东西,比如AddRange,例如.jvitor83的答案提供了该特定方法的性能原理,但是如何缓慢AddRange而不是没有AddRange

继承Collection是比继承更多的工作List,我认为没有任何好处.当然微软不会告诉我无缘无故地做额外的工作,所以我不禁觉得我在某种程度上误解了某些东西,而继承Collection实际上并不是解决我问题的正确方法.

我见过如实施的建议IList …

.net c# oop inheritance list

1299
推荐指数
22
解决办法
17万
查看次数

秒表与使用System.DateTime.Now进行计时事件

我想跟踪我的代码的性能,所以我使用了存储开始和结束时间System.DateTime.Now.我将两者之间的差异作为执行代码的时间.

我注意到差异似乎并不准确.所以我尝试使用一个Stopwatch对象.事实证明,这更加准确.

谁能告诉我为什么Stopwatch比计算开始和结束时间之间的差异更准确System.DateTime.Now

顺便说一句,我不是说百分之十.我得到了大约15-20%的差异.

c# performance datetime timing stopwatch

91
推荐指数
3
解决办法
6万
查看次数

脚本中的ggplot图不会显示在Rstudio中

我对Rstudio有一个奇怪的问题:如果脚本调用ggplot2函数来显示一个图,那么使用Source来运行脚本不会产生图.如果我选择与整个脚本Ctrl+A,然后运行当前行或选择(Ctrl+Enter),然后剧情确实显示.同样,在控制台中键入绘图命令会产生正确的输出.

例如:

library(ggplot2)

p = ggplot(mtcars, aes(wt, mpg))
p + geom_point()
Run Code Online (Sandbox Code Playgroud)

只有在粘贴到控制台时才会产生输出,而不是如果来源.

还有其他问题,但两者都没有帮助:

如何在获取脚本时让Rstudio显示绘图?我使用的是Rstudio 0.98.1062和R 3.1.1.

r ggplot2 rstudio

66
推荐指数
4
解决办法
6万
查看次数

R控制台是我的母语,如何将R设置为英语?

我在Windows 7上使用R.显然R在某种程度上发现了我说英语之外的语言的证据,并固执地坚持用我自己的语言在控制台中输出.由于各种原因,这是不可取的,我希望R是英语.

什么有效

我能够LANGUAGE=en用作R控制台桌面快捷方式的命令行选项,但Rstudio中的语言仍然是错误的,它直接启动R可执行文件,因此忽略了快捷方式中的命令行参数.

什么行不通

我曾尝试创建一个.Renviron下的文件C:\Users\[MY_NAME]\Documents,这是由工作目录返回的路径getwd(),用LANGUAGE=en它.R忽略了这一点.我R_ENVIRONR_ENVIRON_USER变量显示为""所以.Renviron应该是正确的文件名.

我也试过创建.Renvironunder R_HOME\etc(R_HOME指向C:/PROGRA~1/R/R-215~1.0)而R也忽略它.

我是有所增加成功Sys.setenv(LANGUAGE="en")R_HOME\etc-这使得从R控制台英语的所有输出,除了初始的版权信息.

这个问题

如何将R默认为英语,以便将其传播到RStudio?

windows settings localization r rstudio

54
推荐指数
5
解决办法
4万
查看次数

匿名类型的非只读替代方案

在C#中,匿名类型可以如下:

method doStuff(){
     var myVar = new {
         a = false, 
         b = true
     }

     if (myVar.a) 
     {
         // Do stuff             
     }
}
Run Code Online (Sandbox Code Playgroud)

但是,以下内容将无法编译:

method doStuff(){
     var myVar = new {
         a = false, 
         b = true
     }

     if (myVar.a) 
     {
         myVar.b = true;
     }
}
Run Code Online (Sandbox Code Playgroud)

这是因为myVar的字段是只读的,无法分配.似乎想做一些像后者相当普遍的事情; 也许我见过的最好的解决方案就是在方法之外定义一个结构.

但是,真的没有办法让上面的块工作吗?困扰我的原因是,myVar是这个字段的局部变量,所以它似乎只应该在使用它的方法中引用.此外,需要将struct放在方法之外可以使对象的声明远离其使用,特别是在长方法中.

换句话说,有没有匿名类型的替代方法,这将允许我定义这样的"结构"(我意识到结构存在于C#中,必须在方法之外定义)而不使其只读?如果不是,想要这样做是否存在根本性的错误,我应该采用不同的方法吗?

c# struct anonymous-types data-structures

32
推荐指数
3
解决办法
2万
查看次数

如何强制换行?

我注意到如果我在图像后面开始一个新段落,大多数渲染器会在图像和下面的文本之间留下不足的空间.该段最终看起来像一个传奇.虽然当我想要一个图例时这很有用,但有时我只想在两段之间插入一个图像,并且如上所述在下面充分间隔.

我目前纠正了这个问题:

Lorem ipsum dolor sit amet, consectetur adipiscing elit:

[IMAGE]

<br/><br/>

Pellentesque pharetra turpis vitae velit consequat placerat. Duis sed volutpat neque, et scelerisque orci.
Run Code Online (Sandbox Code Playgroud)

但这让我感到不雅观:如果可能,我想避免使用HTML.

还有另一种强制换行的方法吗?

我正在使用Markdown Preview Plus for Atom进行渲染.

markdown line-breaks

31
推荐指数
5
解决办法
3万
查看次数

私有TestInitialize方法不初始化对象

我有一个测试类,基本上应该像下面这样:

[TestClass]
public class MyTest
{
    private MyClass o1;
    private MyClass o2;

    [TestInitialize]
    private void PrepareObjects()
    {
        o1 = new MyClass();
        o2 = new MyClass();
    }

    [TestMethod]
    public void TestEquality()
    {
        Assert.IsTrue(o1.Equals(o2));
    }        
}
Run Code Online (Sandbox Code Playgroud)

但是当我运行测试时,我得到了一个NullReferenceException.如果我把里面的断点PrepareObjectsTestEquality然后我可以看到TestInitialize尚未被援引的时间TestEquality是.

PrepareObjects从私有更改为公共修复此问题.为什么?

c# mstest private-members visual-studio-2012

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

C# - 检查变量是否已初始化

我想检查变量是否在运行时以编程方式初始化.为了使这个不太神秘的原因,请看以下不完整的代码:

string s;

if (someCondition) s = someValue;
if (someOtherCondition) s = someOtherValue;

bool sIsUninitialized = /* assign value correctly */;

if (!sIsUninitialized) Console.WriteLine(s) else throw new Exception("Please initialize s.");
Run Code Online (Sandbox Code Playgroud)

并完成相关位.

一个hacky解决方案是使用默认值初始化s:

string s = "zanzibar";
Run Code Online (Sandbox Code Playgroud)

然后检查它是否发生了变化:

bool sIsUninitialized = s == "zanzibar";
Run Code Online (Sandbox Code Playgroud)

但是,如果someValuesomeOtherValue恰好是"桑给巴尔"呢?然后我有一个bug.有更好的方法吗?

c# initialization

16
推荐指数
3
解决办法
6万
查看次数

在IRC消息中插入换行符

我正在尝试以编程方式使用该PRIVMSG命令发送IRC消息.IRC用于CRLF分隔单独的命令,因此"enter"是每个命令的结尾.

我想发送带有换行符的单个消息,以便收件人(人类IRC用户)看到有休息的响应.这可能吗?我可以使用其他一些换行符吗?我应该在换行符时拆分消息并将其作为多条消息发送吗?

irc line-breaks

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

如何在文本文件的第一行插入行?

我有一个包含的测试文件

1,2,3
2,3,4
5,6,7
Run Code Online (Sandbox Code Playgroud)

我想将其插入第一行: A,B,C

所以我得到:

A,B,C
1,2,3
2,3,4
5,6,7
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

c#

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