C# 使用用户实现的zip函数合并不同大小的数组

C# 使用用户实现的zip函数合并不同大小的数组,c#,linq,C#,Linq,正在尝试以下代码(找到): 使用系统; 使用System.Collections.Generic; 使用System.Linq; 命名空间控制台应用程序1 { 班级计划 { 静态void Main() { var a=新列表{1,2,3}; var b=新列表{1,2,3,4,5}; var xxx=a.Merge(b,(x,y)=>x+y); foreach(xxx中的变量c) { 控制台写入线(c); } } 静态IEnumerable合并(此IEnumerable优先, IEnumerab

正在尝试以下代码(找到):

使用系统;
使用System.Collections.Generic;
使用System.Linq;
命名空间控制台应用程序1
{
班级计划
{
静态void Main()
{
var a=新列表{1,2,3};
var b=新列表{1,2,3,4,5};
var xxx=a.Merge(b,(x,y)=>x+y);
foreach(xxx中的变量c)
{
控制台写入线(c);
}
}
静态IEnumerable合并(此IEnumerable优先,
IEnumerable秒,Func操作)
{
使用(var iter1=first.GetEnumerator())
使用(var iter2=second.GetEnumerator())
{
while(iter1.MoveNext())
{
if(iter2.MoveNext())
{
收益率返回操作(iter1.Current,iter2.Current);
}
其他的
{
产生返回iter1。电流;
}
}
while(iter2.MoveNext())
{
收益率返回2。电流;
}
}
}
}
}

我得到这个错误:

“System.Collections.Generic.List”不包含定义 对于“Merge”且未找到接受“System.Collections.Generic.List”类型的第一个参数的扩展方法“Merge”(是否缺少using指令或程序集引用?)

这是有道理的。但由于我不确定代码应该如何工作,我想完全理解它


如何解决此问题?

必须在静态类中定义扩展-

修复:确保包含
Main
程序
类是静态的

static  class Program
{
    private static void Main() ....

注意:正确的修复方法是将
Merge
扩展方法移动到同一名称空间中的静态类,或者使用
包含的其他名称空间中,扩展必须在静态类中定义

修复:确保包含
Main
程序
类是静态的

static  class Program
{
    private static void Main() ....

注意:正确的修复方法是移动
Merge
扩展方法以分离同一命名空间中的静态类,或使用
包含的其他命名空间中的静态类

public static class Extensions
{
    public static IEnumerable<T> Merge<T>(this IEnumerable<T> first,
                IEnumerable<T> second, Func<T, T, T> operation)
    {
         using (var iter1 = first.GetEnumerator())
         using (var iter2 = second.GetEnumerator())
         {
             while (iter1.MoveNext())
             {
                 if (iter2.MoveNext())
                 {
                     yield return operation(iter1.Current, iter2.Current);
                 }
                 else
                 {
                     yield return iter1.Current;
                 }
             }
             while (iter2.MoveNext())
             {
                 yield return iter2.Current;
             }
         }
     }
}
公共静态类扩展
{
公共静态IEnumerable合并(此IEnumerable优先,
IEnumerable秒,Func操作)
{
使用(var iter1=first.GetEnumerator())
使用(var iter2=second.GetEnumerator())
{
while(iter1.MoveNext())
{
if(iter2.MoveNext())
{
收益率返回操作(iter1.Current,iter2.Current);
}
其他的
{
产生返回iter1。电流;
}
}
while(iter2.MoveNext())
{
收益率返回2。电流;
}
}
}
}

您可以找到工作的fiddler示例

将扩展方法移动到单独的
静态

public static class Extensions
{
    public static IEnumerable<T> Merge<T>(this IEnumerable<T> first,
                IEnumerable<T> second, Func<T, T, T> operation)
    {
         using (var iter1 = first.GetEnumerator())
         using (var iter2 = second.GetEnumerator())
         {
             while (iter1.MoveNext())
             {
                 if (iter2.MoveNext())
                 {
                     yield return operation(iter1.Current, iter2.Current);
                 }
                 else
                 {
                     yield return iter1.Current;
                 }
             }
             while (iter2.MoveNext())
             {
                 yield return iter2.Current;
             }
         }
     }
}
公共静态类扩展
{
公共静态IEnumerable合并(此IEnumerable优先,
IEnumerable秒,Func操作)
{
使用(var iter1=first.GetEnumerator())
使用(var iter2=second.GetEnumerator())
{
while(iter1.MoveNext())
{
if(iter2.MoveNext())
{
收益率返回操作(iter1.Current,iter2.Current);
}
其他的
{
产生返回iter1。电流;
}
}
while(iter2.MoveNext())
{
收益率返回2。电流;
}
}
}
}

您可以找到正在工作的fiddler示例

您可以发布整个异常消息吗,第二部分很重要,它类似于“this take a second argument of…”之类的内容。这不是您的全部代码-它无法编译。扩展方法实际声明在哪里?它在公共静态类中吗?它本身是公开的吗?@Blorgbeard没有意识到它确实是需要的。编辑。你能发布整个异常消息吗,第二部分很重要,它类似于“接受第二个参数…”之类的东西。这不是你的全部代码-它不会编译。扩展方法实际声明在哪里?它在公共静态类中吗?它本身是公开的吗?@Blorgbeard没有意识到它确实是需要的。Prohint:don't trust VS“Error List”窗口-它不会显示根错误,并且可能很容易欺骗您。始终检查“输出”窗口中的第一个错误。提示:不要信任VS“错误列表”窗口-它不会显示根错误,可能很容易欺骗您。始终检查“输出”窗口中的第一个错误。