小编Jür*_*ock的帖子

使用带有String的Subsonic.Select()ExecuteTypedList方法

这是一个关于泛型而不是亚音速的问题:

想象一下,如果有以下代码:

    List<int> result = 
      DB.Select(Product.Columns.Id)
        .From<Product>()
        .ExecuteTypedList<int>();
Run Code Online (Sandbox Code Playgroud)

这很好用,并返回一个包含我的Product表中的ID的通用列表.

但是,如果我想获得ProductName的列表:

    List<String> result = 
      DB.Select(Product.Columns.ProductName)
        .From<Product>()
        .ExecuteTypedList<String>();
Run Code Online (Sandbox Code Playgroud)

它会抛出编译器消息(翻译自德语):

"string"必须是非抽象类型,其公共构造函数不带参数,以便用作泛型类型或在泛型方法"SubSonic.SqlQuery.ExecuteTypedList()"中用作参数"T".

cause:String没有空的构造函数:

int i = new int;       // works
String s = new String; // compiler error: "string" does not contain a constructor that takes '0' argument
Run Code Online (Sandbox Code Playgroud)

如果我使用它List<Object>而不是它有效,但是有更优雅的方式,我可以使用List<String>吗?

更新:List<Object>不起作用.我确实得到了一个对象列表,但这似乎是"空"对象,不包含我的ProductNames(object.ToString()返回{Object})

c# generics subsonic

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

dotNet十进制类型是否容易受到二进制比较错误的影响?

我每隔几个月偶然发现一个错误就是这个错误:

        double x = 19.08;
        double y = 2.01;
        double result = 21.09;

        if (x + y == result)
        {
            MessageBox.Show("x equals y");
        }
        else
        {
            MessageBox.Show("that shouldn't happen!");  // <-- this code fires
        }
Run Code Online (Sandbox Code Playgroud)

您可以假设代码显示"x等于y",但事实并非如此.
简短的解释是,小数位表示为二进制数字,不适合双精度数.

示例:2.625看起来像:

10.101

因为

1-------0-------1---------0----------1  
1 * 2 + 0 * 1 + 1 * 0.5 + 0 * 0.25 + 1 * 0,125 = 2.65
Run Code Online (Sandbox Code Playgroud)

并且一些值(如19.08加上2.01的结果)不能用double的位表示.

一种解决方案是使用常量:

        double x = 19.08;
        double y = 2.01;
        double result = 21.09;
        double EPSILON = 10E-10; …
Run Code Online (Sandbox Code Playgroud)

.net c# comparison decimal

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

为什么VB Parallel.ForEach不能推断我的循环项类型?

我有一类Parent具有财产Items这是一个List(of Child)

如果我使用此代码

Parallel.ForEach()(parent.Items,
            Sub(item)
                item.DoSomething()
            End Sub)
Run Code Online (Sandbox Code Playgroud)

我收到编译器警告 No overload for method ForEach() accepts this count of arguments

如果我将代码更改为

Parallel.ForEach(of Child)(parent.Items,
            Sub(item)
                item.DoSomething()
            End Sub)
Run Code Online (Sandbox Code Playgroud)

有用.

但是,在c#我可以写

Parellel.ForEach(parent.Items, item =>
    {
        item.DoSomething();
    });
Run Code Online (Sandbox Code Playgroud)

为什么VB在这种情况下不推断?

c# vb.net generics type-inference task-parallel-library

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

完成后如何强制石英.net 作业重新启动间隔

我有一个项目,我使用TopShelfTopShelf.Quartz

按照这个例子,我正在构建我的工作

                s.ScheduleQuartzJob(q =>
                    q.WithJob(() => JobBuilder.Create<MyJob>().Build())
                    .AddTrigger(() => TriggerBuilder.Create()
                        .WithSimpleSchedule(builder => builder
                            .WithIntervalInSeconds(5)
                            .RepeatForever())
                        .Build())
                );
Run Code Online (Sandbox Code Playgroud)

即使前一个仍在运行,它也会每五秒触发一次我的工作。我真正想要实现的是开始一项工作,完成后等待五秒钟,然后重新开始。这是可能的还是我必须实现我自己的逻辑(例如通过静态变量)。

.net c# quartz.net topshelf

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

这是dotnet Regex-Parser中的一个错误吗?

我刚写了一个正则表达式来做一个基本的语法检查,如果一个字符串是一个有效的数学公式.我只是定义了一组有效的字符并检查字符串是否匹配(我稍微缩短了正则表达式:

    private static readonly String validFormuar =  @"^[\d\+-\*\/]+$";
    private static bool IsValidFormular(String value)
    {
        return Regex.IsMatch(value, validFormuar);
    }
Run Code Online (Sandbox Code Playgroud)

在这个例子中,我只允许使用数字+, - ,*和/.
因为+,*和/是正则表达式中的特殊字符,所以我将它们转义了.
但是,此代码抛出ArgumentException(从德语翻译)

"^[\d\+-\*\/]+$" is beeing analyzed - [x-y]-area in reversed Order.
Run Code Online (Sandbox Code Playgroud)

如果我双重逃避*

    private static readonly String validFormuar =  @"^[\d\+-\\*\/]+$";
Run Code Online (Sandbox Code Playgroud)

结果如预期.
这是System.Text.RegularExpressions解析器中的错误吗?因为我认为我的第一个正则表达式是正确的.如果没有,为什么我必须两次逃避"*"?

.net c# regex

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