在两个列表中应用运算符的C#惯用方式是什么?

我习惯于这样做(从其他语言):

 a = 1, 2, 3;
 b = 5, 1, 2;

 c = a * b;  // c = 5, 2, 6

这需要两个大小相等的列表,并将一个函数应用于它们的成员,一次一个,以获取结果列表。它可能是一个简单的函数(如上面的乘法),或者更复杂的函数:

 c = b>a ? b-a : 0;  // c = 4, 0, 0

我可以想到在C#中执行此操作的几种不同方法,但是我不确定受过C#培训的程序员如何做到这一点。在C#世界中解决此问题的正确方法是什么?

(我要问的唯一部分是在哪里 c = f(a,b)。我熟悉创建列表并访问其元素。)

乔恩·汉纳
var c = a.Zip(b, (x, y) => x * y);

对于修改后的更复杂的代码:

var c = a.Zip(b, (x, y) => x > y ? x - y : 0);

请注意,Zip既扩展方法Enumerable作用上IEnumerable<T>Queryable作用在IQueryable<T>,所以它是可能的,如果拉姆达是一个给定的查询提供可以处理,它可以作为一个数据库的SQL查询来处理,或者.NET中的内存以外的其他方式。

有人在评论中提到这是4.0的新功能。自己为3.5实现并不难:

public class MyExtraLinqyStuff
{
    public static IEnumerable<TResult> Zip<TFirst, TSecond, TResult>(this IEnumerable<TFirst> first, IEnumerable<TSecond> second, Func<TFirst, TSecond, TResult> resultSelector)
    {
      //Do null checks immediately;
      if(first == null)
        throw new ArgumentNullException("first");
      if(second == null)
        throw new ArgumentNullException("second");
      if(resultSelector == null)
        throw new ArgumentNullException("resultSelector");
      return DoZip(first, second, resultSelector);
    }
    private static IEnumerable<TResult> DoZip<TFirst, TSecond, TResult>(this IEnumerable<TFirst> first, IEnumerable<TSecond> second, Func<TFirst, TSecond, TResult> resultSelector)
    {
      using(var enF = first.GetEnumerator())
      using(var enS = second.GetEnumerator())
        while(enF.MoveNext() && enS.MoveNext())
          yield return resultSelector(enF.Current, enS.Current);
    }
}

对于.NET2.0或.NET3.0,您可以使用相同的方法,但不能将其作为扩展方法,它可以从注释中回答另一个问题。当时在.NET中确实没有一种惯用的方式来做这些事情,或者至少在当时我们用.NET进行编码的人们之间没有达成共识。我们中的一些人在我们的工具包中有类似上面的方法(虽然显然不是扩展方法),但是更多的是,我们受其他语言和库的影响比其他任何事情(例如,由于我从中学到的东西,我正在做类似上面的事情C ++的STL,但这几乎不是唯一的灵感来源)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Coq中两个命题之间加“ +”运算符是什么意思

来自分类Dev

C#中的“ <<”运算符是什么意思

来自分类Dev

为什么运算符重载实现中的两个静态对象在c ++中始终相等?

来自分类Dev

为什么要写两个()运算符

来自分类Dev

如何在C#中存储两个二进制字符串并使用OR运算符

来自分类Dev

两个列表之间的IN运算符在oracle中不起作用

来自分类Dev

python中两个赋值运算符有什么区别?

来自分类Dev

有什么简单的方法可以在Ruby中链接两个比较<=>运算符?

来自分类Dev

为什么“ ==”运算符可在这两个C字符串上运行?

来自分类Dev

在C ++中,等于运算符中两个=之间的空格合法吗?

来自分类Dev

如何在C ++中重载两个不同的I / O运算符

来自分类Dev

C#中Like运算符的替代方法是什么?

来自分类Dev

C#预处理程序指令中运算符的优先级是什么?

来自分类Dev

这个“ >> =”运算符在C中是什么意思?

来自分类Dev

澄清:是什么使“ new”成为C ++中的运算符

来自分类Dev

二元运算符“==”不能应用于两个“Equatable”操作数......什么?

来自分类Dev

Python:处理两个列表的“ Pythonic”方式是什么?

来自分类Dev

Python:处理两个列表的“ Pythonic”方式是什么?

来自分类Dev

PowerShell中的“>”运算符是什么?

来自分类Dev

Unix中的“ ./”运算符是什么?

来自分类Dev

Golang中的“&^”运算符是什么?

来自分类Dev

HTML中的“:”运算符是什么?

来自分类Dev

JavaScript中的%运算符是什么?

来自分类Dev

C#如何检查列表中的n个x(mod运算符?)

来自分类Dev

为什么“ as”运算符在C#中不使用隐式转换运算符?

来自分类Dev

当我们返回具有两个值的整数时,C中的逗号运算符会做什么?

来自分类Dev

作为C#中的运算符,+-会做什么

来自分类Dev

+ =运算符在提供的C#代码中做什么?

来自分类Dev

C#运算符!无法应用

Related 相关文章

  1. 1

    Coq中两个命题之间加“ +”运算符是什么意思

  2. 2

    C#中的“ <<”运算符是什么意思

  3. 3

    为什么运算符重载实现中的两个静态对象在c ++中始终相等?

  4. 4

    为什么要写两个()运算符

  5. 5

    如何在C#中存储两个二进制字符串并使用OR运算符

  6. 6

    两个列表之间的IN运算符在oracle中不起作用

  7. 7

    python中两个赋值运算符有什么区别?

  8. 8

    有什么简单的方法可以在Ruby中链接两个比较<=>运算符?

  9. 9

    为什么“ ==”运算符可在这两个C字符串上运行?

  10. 10

    在C ++中,等于运算符中两个=之间的空格合法吗?

  11. 11

    如何在C ++中重载两个不同的I / O运算符

  12. 12

    C#中Like运算符的替代方法是什么?

  13. 13

    C#预处理程序指令中运算符的优先级是什么?

  14. 14

    这个“ >> =”运算符在C中是什么意思?

  15. 15

    澄清:是什么使“ new”成为C ++中的运算符

  16. 16

    二元运算符“==”不能应用于两个“Equatable”操作数......什么?

  17. 17

    Python:处理两个列表的“ Pythonic”方式是什么?

  18. 18

    Python:处理两个列表的“ Pythonic”方式是什么?

  19. 19

    PowerShell中的“>”运算符是什么?

  20. 20

    Unix中的“ ./”运算符是什么?

  21. 21

    Golang中的“&^”运算符是什么?

  22. 22

    HTML中的“:”运算符是什么?

  23. 23

    JavaScript中的%运算符是什么?

  24. 24

    C#如何检查列表中的n个x(mod运算符?)

  25. 25

    为什么“ as”运算符在C#中不使用隐式转换运算符?

  26. 26

    当我们返回具有两个值的整数时,C中的逗号运算符会做什么?

  27. 27

    作为C#中的运算符,+-会做什么

  28. 28

    + =运算符在提供的C#代码中做什么?

  29. 29

    C#运算符!无法应用

热门标签

归档