LINQ表达式优化语法? -- c# 领域 和 linq 领域 和 .net-4.0 领域 相关 的问题

LINQ expression to optimize syntax?


3
vote

问题

中文
  foreach (var item in mainCanvas.Children) {     if (item is Button)     {         (item as Button).Content = "this is a button";     }                 }   

我可以使用LINQ或.NET 4的其他功能更简洁(可能是表演者)吗?

英文原文
foreach (var item in mainCanvas.Children) {     if (item is Button)     {         (item as Button).Content = "this is a button";     }                 } 

Can I use LINQ or other feature of .NET 4 to be more concise (maybe performant)?

</div
        
         
         

回答列表

12
 
vote
vote
最佳答案
 

您可以使用 Enumerable.OfType

  foreach (var button in mainCanvas.Children.OfType<Button>()) {     button.Content = "this is a button"; }   

性能测量

方法1 :OPS原始建议

  foreach (var item in mainCanvas.Children) {     if (item is Button)     {         (item as Button).Content = "this is a button";     }                 }   

方法2 :OFTYPE

  foreach (var button in mainCanvas.Children.OfType<Button>()) {     button.Content = "this is a button"; }   

方法3 :仅演出一次

  foreach (var item in mainCanvas.Children) {     Button button = item as Button;     if (button != null)     {         button.Content = "this is a button";     }                 }   

方法4 :for循环:

  List<object> children = mainCanvas.Children; for (int i = 0; i < children.Count; ++i) {     object item = children[i];     if (item is Button)     {         (item as Button).Content = "this is a button";     }                 }   

结果

 每秒迭代  方法1:18539180 方法2:7376857 方法3:19280965 方法4:20739241 

结论

  • 可以通过使用简单 for 循环而不是 foreach 。
  • ,可以获得最大的改进。
  • 也可以通过仅铸造一次来提高性能。
  • 使用 OfType 相当慢。

但请记住首先优化可读性,只有在具有性能分布的情况下,只能优化性能,并发现此特定代码是性能瓶颈。

 

You can use Enumerable.OfType:

foreach (var button in mainCanvas.Children.OfType<Button>()) {     button.Content = "this is a button"; } 

Performance Measurements

Method 1: OPs original suggestion

foreach (var item in mainCanvas.Children) {     if (item is Button)     {         (item as Button).Content = "this is a button";     }                 } 

Method 2: OfType

foreach (var button in mainCanvas.Children.OfType<Button>()) {     button.Content = "this is a button"; } 

Method 3: Only cast once

foreach (var item in mainCanvas.Children) {     Button button = item as Button;     if (button != null)     {         button.Content = "this is a button";     }                 } 

Method 4: for loop:

List<object> children = mainCanvas.Children; for (int i = 0; i < children.Count; ++i) {     object item = children[i];     if (item is Button)     {         (item as Button).Content = "this is a button";     }                 } 

Results

 Iterations per second  Method 1: 18539180 Method 2:  7376857 Method 3: 19280965 Method 4: 20739241 

Conclusion

  • The biggest improvement can be gained by using a simple for loop instead of foreach.
  • It is also possible to improve performance slightly by casting only once.
  • Using OfType is considerably slower.

But remember to optimize readability first, and only optimize performance if you have performance profiled and found that this specific code is the performance bottleneck.

 
 
         
         
3
 
vote

一行应该会这样做

  mainCanvas.Children.OfType<Button>.ToList().ForEach(b => b.Content = "this is a button");   
 

One line should do it

mainCanvas.Children.OfType<Button>.ToList().ForEach(b => b.Content = "this is a button"); 
 
 
         
         
1
 
vote

看看是否有 foreach (var button in mainCanvas.Children.OfType<Button>()) { button.Content = "this is a button"; } 0 扩展。

  foreach (var button in mainCanvas.Children.OfType<Button>()) {     button.Content = "this is a button"; } 1  

如果不是,可以使用:

  foreach (var button in mainCanvas.Children.OfType<Button>()) {     button.Content = "this is a button"; } 2  
 

See if there is an OfType<T> extension.

foreach (var item in mainCanvas.Children.OfType<Button>())  {      item.Content = "this is a button";  } 

If not, you can use:

foreach (var item in mainCanvas.Children.Where(item=>item is Button).Cast<Button>())  {      item.Content = "this is a button";  } 
 
 
 
 
1
 
vote

并不是特别优越,但这个语法有一些很好的事情:

使用linq和microsoft acctivextensions 框架,

  foreach (var button in mainCanvas.Children.OfType<Button>()) {     button.Content = "this is a button"; } 3  
 

Not that it's particularly superior, but there is something nice about this syntax:

Using LINQ and the Microsoft ReactiveExtensions framework,

mainCanvas.Children    .OfType<Button>()    .Do(b => b.Content = "I'm a button!")    .Run(); 
 
 
1
 
vote

只迭代集合中的实际按钮,您可以执行以下操作:

  foreach (var button in mainCanvas.Children.OfType<Button>()) {     button.Content = "this is a button"; } 4  

据我所知,这是在上面的方法4中转换成的语法糖。但请不要引用我。 (编辑:方法3我的意思)

 

To only iterate over actual buttons in a collection, you can do:

foreach(Button button in mainCanvas.Children)      button.Content = "this is a button"; 

As far as I understand, this is syntax sugar that gets converted into Method 4 above. But don't quote me on that. (EDIT: Method 3 I meant)

 
 

相关问题

1  C#在二进制模式下通过串行端口发送数据  ( C sharp send data over serial port in binary mode ) 
teraterm可以使用"二进制模式" 来传输文件。有人可以让我知道"二进制模式" 和"非二进制模式" 之间有什么区别? 我必须在C#项目上做同样的事情,我真的不确定我是否需要一些特别的东西,以便在"二进制模式" 中发送文件,这是一个缺乏知识的案例。 提前谢谢! ...

0  如何获取属性名称和值  ( How to get the property name and value ) 
我想创建一个处理程序,它将占用lambda表达式并返回传递的属性的名称以及属性的值。 这是一个样本: class Program { static void Main(string[] args) { var handler = new Handler(); Contac...

0  为什么列表中的错误<>在c#中?  ( Why does an error in list in c ) 
我是class / object.i我收到这个错误。我不知道为什么这不是导航到所需的页面。有我的代码。谢谢你帮助~~ webservice1.asmx.cs ////////////////scripts.js import {Circle} from 'shapes'; c = new Circle(4...

2  从非结构化消息中提取数据的模式  ( Pattern for extracting data from unstructured message ) 
我们的一个应用程序接收传感器中发送的数据。通过检查消息的内容,应用程序必须弄清楚它查看的消息类型以及传感器正在运行的固件版本。较新的固件版本发送额外数据,必须以不同的方式处理。 我提供了下面的例子,显示了不同版本的数据消息以及使用不同结构的配置消息。 您可以看到某些数据是逗号分隔,而某些数据则由新行分隔。该消息中还有...

2  从ASP.NET返回一个字节数组,然后从C#应用程序下载  ( Return a byte array from asp net and download it from c sharp application ) 
所以我有一个ASP.NET应用程序,它在GET请求上写一个字节数组,我正在尝试在C#应用程序中接收该字节数组。但是当我尝试下载时,我似乎只收到了标题。 (TotalBuff) 我不是在解释中最好的,但我希望代码能够更清楚。 asp.net代码: var resp = new HttpResponseMessag...

5  我应该何时使用params对象[]与字典<string,对象>?  ( When should i use params object versus dictionarystring object ) 
我将API定义为界面,我们将呼叫 IFoo ,我想定义一个方法 99887661 此方法 Bar() 将采用一个必需的参数,然后采取一个任意数量的其他参数。对这些其他参数的解释将达到 IFoo 的实施者 对于使用 params 或使用 Dictionary<String, Object> e,它是更适合定义我...

0  如何知道string.replace或stringbuilder.replace将修改字符串吗?  ( How can i know if string replace or stringbuilder replace will modify the string ) 
我想知道我是否需要做 / StringBuilder.Replace 在我的字符串上。 所以我有两种方法可以做到这一点。 第一种方式: var myString = new StringBuilder("abcd"); var copyMyString = myString; myString = myStr...

-1  如何在日期自动发送电子邮件发送通知?  ( How to send notifications by email automatically on a date ) 
我有一点问题,我不知道如何在.NET MVC中编写一个函数,以在日期发送电子邮件。 例如:每个月的每隔25日都向我的团队合作伙伴发送电子邮件以记住他们更新库存。和每个月的27日发送给他的老板发送给他的股票。 我试图这样做,但是我代码一定是每次某人的输入到webapp检查日期,如果是第25次发送电子邮件。 问题:...

1  如何将数据库中的数据处理到数组中?  ( How to process the data in the database into arrays ) 
目前我正在使用 C# 和 Linq 和我有一个不可批准的数据库(如下图所示)。有人可以教我如何将"统计" 的数据存储到四个阵列中。 第一个阵列:"homeshot" 第二阵列:"homescore" 第三个阵列:"散步" 第四阵:"避开" ...

1  拆分串多个字符没有空格C#  ( Split string multiple characters without space c sharp ) 
我有一个在div内显示的字段,问题是,如果用户置于一个延长的字符串,则不会破坏线路,该字符串可以置于div内的行外部的字符数,基本上在div之外伸展。如何在"字符串中的字符串中的每个单词" 中插入一个空格,该空格具有20个字符的SEUQUCE或更多而没有空格。例如,现在我正在做这个 string words Re...

1  复制带有块流的文件导致文件由于上次读取而导致的不同大小  ( Copy files with a chunked stream causes the files to be different sizes due to l ) 
有人可以努力解释我如何在使用块流复制它后如何让我的文件相同的大小?我认为它是因为最后一个块仍然有 buffer 2048 所以它在最后放置了空字节,但我不确定如何调整最后一个读取? 原始尺寸: 15.1 MB( 15,835,745 字节) 新尺寸: 15.1 MB( 15,837,184 字节) ...

0  我在C#中创建了椭圆...... BT我想使用鼠标在画布周围移动椭圆......有人可以帮助吗?我是C#[关闭]的新手  ( Ive created a ellipse in c bt i want to move ellipse around the canvas using ) 
关闭。这个问题需要更多聚焦。它目前不接受答案。 想要改进这个问题?更新问题,因此它仅拍摄了一个问题,只有编辑此帖。 关闭 4年前。 ...

4  将C#函数指针传递给C ++ / CLI Interop DLL  ( Passing c sharp function pointers into c cli interop dll ) 
我正在尝试将函数指针从c#传递到c ++ / cli中,并获取此语言不支持 ManagedTakeCallback 函数的Windows编译器错误(C#) - 我定义了 ManagedTakeCallback 在C ++ / CLI互操作中。我的代码看起来像 c#应用程序: namespace ManagedC...

4  Windows Phone 8.1上的Bingmapstask  ( Bingmapstask on windows phone 8 1 ) 
在Windows Phone 8上,我们使用Bingmapstask调用手机的Bing地图应用程序C#。但是Windows Phone 8.1,BingMapstask无法正常工作? 如何在Windows Phone 8.1上调用Bing映射?有人帮忙吗? ...

2  如何在Windows表单中打开app.config?  ( How to open app config in windows forms ) 
我需要用点击一个按钮打开app.config。我一直在想知道怎么用运气。如何打开文件本身,以便我可以编辑它? ...




© 2021 it.wenda123.org All Rights Reserved. 问答之家 版权所有


Licensed under cc by-sa 3.0 with attribution required.