【问题标题】:How to pass an array and a single element to a multiple argument method?如何将数组和单个元素传递给多参数方法?
【发布时间】:2013-08-02 12:45:05
【问题描述】:

例子:

public void foo(params string[] s) { ... }

我们可以调用这个方法:

a) foo("test", "test2", "test3") // multiple single strings
b) foo(new string[]{"test", "test2", "test3"}) // string array

但是无法调用方法:

c) foo("test", new string[]{"test", "test2", "test3"})

所以当我有一个字符串和一个字符串数组时,我是否必须先将它们放入一个数组中才能调用该方法?还是有一个很好的解决方法来告诉方法将字符串数组视为单个字符串?

【问题讨论】:

  • 您必须先将它们放入一个数组中
  • 是的,您必须将它们放入一个数组中...以匹配函数签名。除非你添加一个接受一个字符串和一个字符串数组的包装方法。
  • 为此使用 Dictionary

标签: c# methods


【解决方案1】:

我认为您假设string[] s 接受单个字符串参数以及字符串数组,但事实并非如此。你可以通过这个来实现。

public static void Test(string[] array, params string[] s)
{

}

(记住params 必须是最后一个参数)

然后调用:

Test(new string[]{"test", "test2", "test3"}, "test");

注意数组是如何首先传入的,然后是作为params 传递的参数。

【讨论】:

    【解决方案2】:

    虽然您可以在不使用扩展方法的情况下解决此问题,但我实际上建议使用此扩展方法,因为我发现当我只有一个对象但需要一个简单返回的 IEnumerableT> 时它非常有用那个单一的对象。

    扩展方法:

    public static class EnumerableYieldExtension
    {
        public static IEnumerable<T> Yield<T>(this T item)
        {
            if (item == null)
                yield break;
    
            yield return item;
        }
    }
    

    扩展方法在很多场景中都很有用。在您的情况下,您现在可以这样做:

    string[] someArray = new string[] {"test1", "test2", "test3"};
    foo(someArray.Concat("test4".Yield()).ToArray());
    

    【讨论】:

      【解决方案3】:

      只有方法的最后一个参数可以是参数数组 (params),因此您不能将多个变量传递给签名只接受 params 的方法。

      因此,您在 C 中尝试执行的操作是不可能的,您必须将该字符串添加到数组中,或者创建一个也首先接受字符串参数的重载。

      public void foo(string firstString, params string[] s)
      {
      } 
      

      【讨论】:

        【解决方案4】:

        只需将您的字符串添加到数组中:

        var newArray = new string[oldArray.length+1];
        newArray[0]=yourString;
        oldArray.CopyTo(newArray, 1);
        
        foo(newArray);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-10-24
          • 1970-01-01
          • 1970-01-01
          • 2012-05-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多