小编d..*_*d..的帖子

Expression.Reduce()有什么作用?

我已经使用表达式树几天了,我很想知道Expression.Reduce()的作用.在MSDN文档是不是非常有帮助,因为它只是说,它"减少"的表述.为了以防万一,我尝试了一个例子(见下文)来检查这种方法是否包括数学减少,但似乎并非如此.

有谁知道这种方法的作用,是否有可能提供一个快速示例显示它的实际效果?有什么好资源吗?

static void Main(string[] args)
{
    Expression<Func<double, double>> func = x => (x + x + x) + Math.Exp(x + x + x);
    Console.WriteLine(func);
    Expression r_func = func.Reduce();
    Console.WriteLine(r_func); // This prints out the same as Console.WriteLine(func)
}
Run Code Online (Sandbox Code Playgroud)

.net c# lambda expression-trees

35
推荐指数
3
解决办法
8086
查看次数

Java和.NET中ToString()的原始原因是什么?

我过去曾经ToString()谦虚地使用过,而且在很多情况下我发现它非常有用.但是,我对这种方法的使用几乎没有理由将这种方法放在其他方面System.Object.我的猜测是,在进行的工作和为了提出.NET框架的初始设计而举行的会议期间的某些时候,我们认为必须 - 或者至少非常有用 - 包含一个ToString()方法,由.NET框架中的所有内容实现.

有谁知道具体原因是什么?我是否错过了大量ToString()证明有用的情况System.Object?最初的原因是ToString()什么?

非常感谢!

PS - 再说一遍:我不是在质疑这个方法,也不是暗示它没有用,我只是想知道是什么让它变得有用System.Object.

旁注 - 想象一下:

AnyDotNetNativeClass someInitialObject = new AnyDotNetNativeClass([some constructor parameters]);

AnyDotNetNativeClass initialObjectFullCopy = AnyDotNetNativeClass.FromString(someInitialObject.ToString());

这不是很酷吗?

EDIT(1):

(A) - 基于一些答案,似乎.NET语言从Java继承了这一点.所以,我正在为主题和标签添加"Java".如果有人知道为什么这是用Java实现的,那么请说清楚!

(B) - 静态假设FromString与序列化:当然,但这是一个完全不同的故事,对吗?

.net java tostring

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

如何创建表达式<Func <动态,动态>> - 或者它是一个错误?

在我用表达树做了几天的时候,我遇到了一些我觉得难以理解的东西; 希望有人能够在这里阐明一些亮点.

如果您编写代码Expression<Func<dynamic, dynamic>> expr1 = x => 2 * x;,编译器会抱怨并且您将无法获得任何结果.但是,似乎如果你通过一个方法创建一个这样的表达式,那么编译器似乎对此感到高兴并且生成的应用程序可以工作.这没有意义,所以我想知道幕后发生了什么.

我想,在引擎盖下,返回的表达式ConvertExpression可能是类型Expression<Func<object, object>>,这是一个有效的类型,但它让我感到困惑,我不能Expression<Func<dynamic, dynamic>>在声明中使用类型,但我可以将它用作方法的返回类型.请参阅下面的示例.

非常感谢!

public class ExpressionExample
{
    public void Main()
    {
        // Doesn't compile:
        //Expression<Func<dynamic, dynamic>> expr1 = x => 2 * x;

        // Compiles and works - OK
        Expression<Func<double, double>> expr2 = x => 2 * x;
        Func<double, double> func2 = (Func<double, double>)expr2.Compile();
        Console.WriteLine(func2(5.0).ToString()); // Outputs 10

        // Compiles and works - ??? This is the confusing …
Run Code Online (Sandbox Code Playgroud)

c# lambda dynamic .net-4.0 expression-trees

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

OOC:ToList()和.NET中的List <T>之间的区别是什么?

OOC:出于好奇心

所以,作为一个小练习,为了学习,我决定检查我是否能够实现一个非常基本的递归函数,它将返回一个List<int>,但有以下限制:

1-结果应该由函数本身返回(而不是作为参数传递给void函数).

2 - 在函数体中声明没有本地"命名"变量.

我想出了下面的解决方案(BTW:这可以以任何方式改进吗?)

在这样做的过程中,我了解到这ToList()与投射不同List<T>(参见下面的示例) - 任何人都可以解释幕后发生的事情以及两者之间的区别是什么?

谢谢!

PS - 我正在使用4.0版(如果它很重要).

编辑:运行时错误是 Unable to cast object of type '<ConcatIterator>d__71'1[System.Int32]' to type 'System.Collections.Generic.List'1[System.Int32]'

public static List<int> SomeIntegers(int min, int max)
{
    //assume max >= min for simplicity  
    if (min == max)
        return new List<int>() { min };

    // runtime error 
    //return (List<int>)(SomeIntegers(min, max - 1).Concat(new List<int>() { max }));   

    //works
    return (SomeIntegers(min, max - 1).Concat(new List<int>() { max })).ToList(); 
}
Run Code Online (Sandbox Code Playgroud)

c# collections casting

8
推荐指数
2
解决办法
2537
查看次数

如何在.NET中检查值类型之间的"安全"转换?

回到基础......

对于参考类型,可以这样做:

        SomeType someObject = firstObject as SomeType;
        if (someObject == null)
        {
            // Handle the situation gracefully
        }
        else
        {
            // Do stuff
        }
Run Code Online (Sandbox Code Playgroud)

对于值类型,我的理解是我们有隐式转换(没有数据丢失),显式转换(如果存在数据丢失的风险需要),Convert类(我认为是"转换包装器")以及类型特定的转换(例如double x = Double.Parse("2");),但我没有发现任何类似于as上面的操作符.

所以,我的问题是:框架是否提供了一些方法/操作符/技术来执行以下操作:

        if (!Convert.CanConvert(someValue, someValueType))
        {
            // Beware! Data loss can occur
        }
        else
        {
            // No data loss here
        }
Run Code Online (Sandbox Code Playgroud)

如果没有,那么任何人都可以建议一个可靠的方法来构建一个这样的CanConvert方法吗?

非常感谢!

编辑(1):用户案例/问题如下:给定代码的消费者传递的东西(我的另一个自己,但这是无关紧要的),(1)检查某事是否是一个数字(足够简单)和(2)将某些东西放在适合的"最小"数字类型中,而不会导致数据丢失.

一些背景:我正在尝试做的事情的本质是数学而不是技术:我试图看看是否/如何将现有的数字类型拟合成某种形式的代数层次结构Monoid => Group => Ring => Field(或其简化版本).在努力解决这个问题时,并不是很确定,"有一件事导致了另一件事",我发现自己不得不处理类型转换......

.net math algebra

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

哪里可以发布格式良好的代码与LaTeX结合用于数学表达式?

不可否认,这不是一个编程问题,但我真的不知道在哪里问这个......

我打算开一个博客来发布我正在研究的东西,主要是表达树和数学.希望这将有助于我专注于手头的问题,而不是消除每一个可能出现的切线.

我想知道是否有人知道有一个好地方来主持一个博客有以下两个要求:

(1)用于代码清单尼斯支撑(如图这里,例如).

(2)支持复杂的数学表达式,理想地在胶乳(如图这里,例如).

有一段时间我现在一直在寻找结合了格式良好的代码和数学表达式的帖子/文章,但我还没有找到任何东西.

非常感谢!

PS - 如果还有另一个Q&A论坛,这个问题会更合适,那么请告诉我,我会把它移到那里.

编辑(1):在进行一些额外的研究时,我发现了这个相关的SO问题(参见其中的资源),然后我带到了这里.暂时保持这个问题,以防万一有人想提出替代方案.

math blogs code-formatting

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

一个类可以继承.NET中的LambdaExpression吗?或者这不推荐?

请考虑以下代码(C#4.0):

public class Foo : LambdaExpression { }

这会引发以下设计时错误:

Foo does not implement inherited abstract member
System.Linq.Expressions.LambdaExpression.Accept(System.Linq.Expressions.Compiler.StackSpiller)
Run Code Online (Sandbox Code Playgroud)

绝对没有问题,public class Foo : Expression { }但是出于好奇和为了学习,我在谷歌搜索System.Linq.Expressions.LambdaExpression.Accept(System.Linq.Expressions.Compiler.StackSpiller)并猜测:返回零结果(你最后一次看到的是什么时候?).不用说,我还没有在其他任何地方找到关于此方法的任何文档.

正如我所说,人们可以很容易地继承Expression; 另一方面LambdaExpression,虽然没有标记为sealed(Expression<TDelegate>从它继承),但似乎是为了防止继承它.实际情况如此吗?有没有人知道这种方法是什么?

编辑(1):基于第一个答案的更多信息 - 如果您尝试实现接受,编辑器(C#2010 Express)会自动为您提供以下存根:

protected override Expression Accept(System.Linq.Expressions.ExpressionVisitor visitor)
{
    return base.Accept(visitor);
}
Run Code Online (Sandbox Code Playgroud)

但是你仍然会得到同样的错误.如果您尝试直接使用类型的参数StackSpiller,编译器会抛出另一个错误:System.Linq.Expressions.Compiler.StackSpiller is inaccessible due to its protection level.

编辑(2):基于其他答案,继承LambdaExpression是不可能的,所以关于它是否被推荐的问题变得无关紧要.我想知道,在这种情况下,错误信息是否应该是Foo cannot implement inherited abstract member System.Linq.Expressions.LambdaExpression.Accept(System.Linq.Expressions.Compiler.StackSpiller) because [reasons go here]; 当前的错误消息(正如一些答案所证明的)似乎告诉我,我需要做的就是实现Accept(我不能这样做).

.net c# lambda inheritance

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

我应该用什么开发工具来编写F#代码?

我在当天(在VS2010测试版之前)开始使用F#; 当时,如果我没记错的话,没有F#的Express版本,但是可以使用VS Shell(我认为这就是名字),然后在它上面安装F#.

目前的情况如何?我在那里读到没有2010版的F#版本; 是否有一个2010年壳牌,谁可以下载和安装F#最新?如果没有,那么在F#2010中免费编码的最佳方式(如果有的话)是什么?

我知道要求免费的东西是很多要求的.但这在VS2008中是可能的,我想知道它是否也可能在VS2010中.

谢谢!

PS - 我相信(不确定)VS2010测试版可以免费下载; 问题在于,当最终版本发布时,必须支付许可证.对于像我这样编码乐趣的人来说,如果我可以免费获得基本功能,那么购买完整版本没有多大意义...

f# visual-studio

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

在C#中转换类型为Func <T,T>的对象时出现问题

为什么不编译?我想有办法解决这个问题; 只是好奇.

谢谢!

    static void Main(string[] args)
    {
        Func<int, int> f_int = n => n * n;
        Func<int, double> f_double = (Func<int, double>)f_int;
    }
Run Code Online (Sandbox Code Playgroud)

c# generics lambda

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

.NET 4.0中的表达式树:Expression.Call无法在List <T>类型中找到方法"get_Item"

我坚持下面的问题,并想知道是否有人能够提供帮助.我在代码中添加了注释,使其不言自明,但如果您需要更多信息或问题不清楚,请告诉我.

非常感谢提前!

编辑:我被要求在文本中总结问题,所以在这里:在下面的代码中描述的情况下,Expression.Call(...)抛出以下异常:"类型上没有方法'get_Item' 'System.Collections.Generic.List`1 [System.Double]'"

我相信该方法确实存在于类型中,如下所示:

List<double> sampleList = new List<double>();

Console.WriteLine(sampleList.GetType().GetMethod("get_Item") == null); // False

我也把这个标题描述得更具描述性; 抱歉,如果最初的问题不明确.

public class ExpressionExample
{
    public void Main()
    {
        Expression<Func<List<double>, double>> component = u => u[0];
        Console.WriteLine(component.Body.NodeType); // Prints out "Call"
        Console.WriteLine(component.Body); // Prints out "u.get_Item(0)"

        MethodCallExpression copyGetComponent = CopyCallExpression(component.Body as MethodCallExpression);
    }

    public MethodCallExpression CopyCallExpression(MethodCallExpression callExpression)
    {
        if (callExpression == null)
            return null;

        // Some tests
        Console.WriteLine(callExpression.Method.Name); // "get_Item"
        List<double> sampleList = new List<double>();
        Console.WriteLine(sampleList.GetType().GetProperty("get_Item") == null); // True
        Console.WriteLine(sampleList.GetType().GetProperty("Item") == null); …
Run Code Online (Sandbox Code Playgroud)

c# lambda .net-4.0 expression-trees

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