小编Col*_*ett的帖子

单元测试Visual Studio 2008 Pro中的浮点运算

我有一些C#单元测试执行一些浮动/双重操作,我想对它们进行单元测试.由于舍入错误,Assert.AreEqual不足.

以单位转换为例.10.5米到英尺的转换系数是3.281,所以我得到34.4505.使用更准确的转换因子给了我34.4488189.我想在0.1内测试这个(所以34.3488-34.5488会通过测试).

我可以确定在我的单元测试中使用容差手动测试该值,但这是高度重复的,并且失败消息不会非常具有描述性(同样不必编写我自己的Assert失败消息):

Assert.IsTrue(Math.Abs(34.4488189 - value) < 0.1);
Run Code Online (Sandbox Code Playgroud)

如何将我的浮点运算单元测试到一定的容错范围内? 我找不到任何与VS一起提供的Assert类.我错过了它还是我必须自己滚动?

是否有标准做法测试花车/双打要记住?

c# floating-point unit-testing .net-3.5

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

将XML字符串注入XmlWriter时的XML缩进

我有一个XmlTextWriter使用该文本编写器写入文件和XmlWriter.此文本编写器设置为输出制表符缩进的XML:

XmlTextWriter xtw = new XmlTextWriter("foo.xml", Encoding.UTF8);
xtw.Formatting = Formatting.Indented;
xtw.IndentChar = '\t';
xtw.Indentation = 1;

XmlWriter xw = XmlWriter.Create(xtw);
Run Code Online (Sandbox Code Playgroud)

根据Jeff的MSDN链接更改:

XmlWriterSettings set = new XmlWriterSettings();
set.Indent = true;
set.IndentChars = "\t";
set.Encoding = Encoding.UTF8;

xw = XmlWriter.Create(f, set);
Run Code Online (Sandbox Code Playgroud)

这不会改变最终结果.


现在我在我的XmlWriter中是一个任意深度,我从其他地方(我无法控制)得到一串XML,这是一个单行,非缩进的XML.如果我调用xw.WriteRaw(),那么该字符串是逐字注入的,并不遵循我想要的缩进.

...
string xml = ExternalMethod();
xw.WriteRaw(xml);
...
Run Code Online (Sandbox Code Playgroud)

本质上,我想要一个WriteRaw,它将解析XML字符串并遍历所有WriteStartElement等,以便根据XmlTextWriter的设置重新格式化.

我的偏好是使用我已经拥有的设置执行此操作的方法,并且无需重新加载最终XML以重新格式化它.我也不想用XmlReader等解析XML字符串,然后模仿它在我的XmlWriter中找到的东西(非常非常手动的过程).

在结束时,我宁愿有一个简单的解决方案,而不是遵循我的偏好.(当然,最好的解决方案很简单,并且符合我的偏好.)

.net c# xml

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

改进/修复C样式块注释的正则表达式

我正在编写(在C#中)一个简单的解析器来处理一个看起来很像经典C的脚本语言.

在我拥有的一个脚本文件中,我用来识别/*阻止注释*/的正则表达式将进入某种无限循环,占用100%的CPU.

我正在使用的正则表达式是这样的:

/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/
Run Code Online (Sandbox Code Playgroud)

有关为什么会被锁定的任何建议?

或者,我可以使用的另一个正则表达式是什么?

更多信息:

  • 使用面向.NET 3.5的C#3.0;
  • 我正在使用Regex.Match(string,int)方法在字符串的特定索引处开始匹配;
  • 我让程序运行了一个多小时,但比赛没有完成;
  • 传递给Regex构造函数的选项是RegexOptions.MultilineRegexOptions.IgnorePatternWhitespace;
  • 正则表达式适用于我的453个测试文件中的452个.

c c# regex parsing comments

10
推荐指数
2
解决办法
7530
查看次数

COALESCE与NULL

我在一个视图中发现了这个SQL片段,我对它的目的感到困惑(为了简洁起见缩短了实际的SQL):

SELECT
    COALESCE(b.Foo, NULL) AS Foo

FROM a
LEFT JOIN b ON b.aId=a.Id
Run Code Online (Sandbox Code Playgroud)

我想不出与null合并的目的的单一原因而不是仅仅这样做:

SELECT
    b.Foo AS Foo

FROM a
LEFT JOIN b ON b.aId=a.Id
Run Code Online (Sandbox Code Playgroud)

或者至少不要明确地包含NULL:

SELECT
    COALESCE(b.Foo) AS Foo

FROM a
LEFT JOIN b ON b.aId=a.Id
Run Code Online (Sandbox Code Playgroud)

我不知道是谁创作了这个(所以我不能问),是什么时候创作的,或者是为它编写的具体MS SQL Server版本(尽管如此,2008年之前).

有没有合理的理由与NULL合并而不是直接选择列? 我忍不住笑了,把它写成了一个新手的错误,但这让我想知道是否有一些我不知道的"边缘情况".

sql t-sql sql-server coalesce

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

如何为hyptherthreading/multicore选择最佳线程数?

我在.NET 3.5控制台应用程序中有一些令人尴尬的可并行化工作,我想利用超线程和多核处理器. 如何在任意系统上选择最佳数量的工作线程来充分利用其中任何一种? 例如,如果它是双核,我将需要2个线程; 四核我想要4个线程.我最终得到的是确定处理器特性,以便我知道要创建多少线程.

我不是问如何拆分工作也不是如何进行线程,我问我如何确定这个控制台应用程序运行的任意机器上的"最佳"线程数.

c# multithreading .net-3.5

8
推荐指数
3
解决办法
5155
查看次数

如何在C#中禁用隐含的"this"?

这困扰了我很多,我发现当与Intellisense(VS 2008 Pro)结合使用时,我会写出愚蠢的错误:

class Foo
{
    public Foo(bool isAction)
    {
        this.IsAction = IsAction;
    }

    public bool IsAction { get; private set; }
}
Run Code Online (Sandbox Code Playgroud)

你懂了吗?我当然没有,直到IsAction从未改变,导致错误.

智能感知某种方式转换" isA<tab>"到"IsAction"对我来说,这意味着该属性Foo.IsAction始终不管构造输入错误.太棒了

我不得不说我特别讨厌"隐含的this"(我不知道它是否有一个正式名称),我想把它关掉所以它永远不会假设它. 有没有办法做到这一点? 这也适用于调用同一类的静态方法.

或者,哪些命名约定可以避免这个小问题? 该属性必须保持"IsAction",因此它必须是构造函数参数名称的约定.奇怪的是,如果我用完全匹配的拼写命名,那么就this.IsAction = IsAction;可以正常工作.

问题不是区分大小写的语言,而是隐含的this.现在我考虑一下,这也是一个VS 2008 Pro问题而不是C#.我可以使用已经编写过的代码,this但是我不想写没有它的新代码,这意味着告诉In


Noldorin的回答让我思考.

现在我考虑一下,这也是一个VS 2008问题而不是C#.我可以使用已经没有编写的代码this(虽然如果我在那里,我会改变它)但我不想写没有它的新代码,这意味着告诉Intellisense停止这样做. 我可以告诉Intellisense将其击败吗?

c# this .net-3.5 visual-studio-2008

7
推荐指数
2
解决办法
913
查看次数

C#编译器的泛型,继承和失败的方法解析

我今天碰到了编辑问题,这让我感到困惑.考虑这两个容器类.

public class BaseContainer<T> : IEnumerable<T>
{
    public void DoStuff(T item) { throw new NotImplementedException(); }

    public IEnumerator<T> GetEnumerator() { }
    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { }
}
public class Container<T> : BaseContainer<T>
{
    public void DoStuff(IEnumerable<T> collection) { }

    public void DoStuff <Tother>(IEnumerable<Tother> collection)
        where Tother: T
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

前者定义DoStuff(T item),后者DoStuff <Tother>(IEnumerable<Tother>)专门用它来解决C#的协方差/逆变的缺失(直到4听到).

这段代码

Container<string> c = new Container<string>();
c.DoStuff("Hello World");
Run Code Online (Sandbox Code Playgroud)

遇到一个相当奇怪的编译错误.请注意<char>方法调用中没有.

类型'char'不能用作泛型类型或方法'Container.DoStuff(System.Collections.Generic.IEnumerable)'中的类型参数'Tother'.从'char'到'string'没有拳击转换.

从本质上讲,编译器试图我的电话果酱DoStuff(string)进入Container.DoStuff<char>(IEnumerable<char>),因为string工具IEnumerable<char>,而不是使用BaseContainer.DoStuff(string) …

c# generics compilation

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

当用作方法参数的前缀时,"this"是什么意思?

我确定答案是显而易见的,我有点不好意思我已经不知道答案,但考虑一下我在阅读"Professional ASP.NET MVC 1.0"时选择的以下代码示例:

public static class ControllerHelpers
{
    public static void AddRuleViolations(this ModelStateDictionary modelState, IEnumerable<RuleViolation> errors)
    {
        foreach (RuleViolation issue in errors)
            modelState.AddModelError(issue.PropertyName, issue.ErrorMessage);
    }
}
Run Code Online (Sandbox Code Playgroud)

我理解这个静态方法正在做什么,但我不明白的是"this"这个词在方法签名中的用途是什么.任何人都可以开导我吗?

c# extension-methods language-features

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

可变的值类型包装器,传递给迭代器

我正在编写一个需要传递可变整数的迭代器.

public IEnumerable<T> Foo(ref int valueThatMeansSomething)
{
    // Stuff

    yield return ...;
}
Run Code Online (Sandbox Code Playgroud)

这让我知道"错误476迭代器不能有ref或out参数".

我需要的是在迭代器中修改这个整数值,并由迭代器的调用者使用.换句话说,无论Foo()上述任何调用都想知道最终值,valueThatMeansSomething并且Foo()可以自己使用它.真的,我想要一个引用类型的整数,而不是值类型.

我唯一能想到的是写一个封装了我的整数的类,并允许我修改它.

public class ValueWrapper<T>
    where T : struct
{
    public ValueWrapper(T item)
    {
        this.Item = item;
    }

    public T Item { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

所以:

ValueWrapper<int> w = new ValueWrapper<int>(0);
foreach(T item in Foo(w))
{
    // Do stuff
}

if (w.Item < 0) { /* Do stuff */ }
Run Code Online (Sandbox Code Playgroud)

在BCL中是否有任何类或机制来处理这个问题?ValueWrapper<T>上面提出的任何缺陷?

(我的实际使用比上面的例子更复杂,所以在我的foreach循环中处理调用的变量Foo()不是一个选项.期间.)

c# iterator value-type reference-type .net-3.5

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

FormatProvider与扩展方法vs.新类

我想要输出一个整数到罗马数字并由Jesse Slicer 运行这个答案.这是一种扩展方法,但我想知道如何利用ToString(string, IFormatProvider)这样做

int a = 10;
string b = a.ToString("RN", provider);
// OR
string c = string.Format(provider, "{0:RN} blah foo", a);
Run Code Online (Sandbox Code Playgroud)

代替

int a = 10;
string b = a.ParseRomanNumeral();
// OR
string c = string.Format("{0} blah foo", a.ParseRomanNumeral());
Run Code Online (Sandbox Code Playgroud)

我从来没有写过格式提供程序,所以我不确定所涉及的工作,但这是我的问题. 对于像罗马数字这样明确定义的格式转换,您会使用:

  • 格式提供者
  • 使用扩展方法
  • 写一个实现RomanNumeral类Parse,TryParseToString
  • 别的

为什么?

使用string.Format()和它的任何堂兄方法(例如StringBuilder.AppendFormat())会影响你的答案吗?显然,使用扩展方法,您无法使用这些格式化方法之一访问转换.

我认为实现整个色域的自定义类将是最谨慎但也是最耗时的.使用自定义格式提供程序似乎会踩到一些现有全球化的东西(如果你有的话).

c# extension-methods .net-3.5 roman-numerals

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