【问题标题】:How to create a method that allows arrays to act like single values?如何创建一个允许数组像单个值一样工作的方法?
【发布时间】:2017-05-29 00:38:53
【问题描述】:

这是一种假设方法,允许数组使用单个对象可以使用的函数。这将允许数组使用仅对单个对象可用的方法。我只需要一个在所有类型的数组上运行的通用方法。此方法将对该数组的各个值运行另一种方法。然后这些单独的值将作为数组返回。这适用于所有类型。如果可能,此方法不应该对对象可以使用它有任何限制。重复一遍,代码中的任何地方都没有约束。这可能以另一种形式出现吗?这在 C# 中合法吗?

string[] s = new string[] { "hi", "hello", "what's up" }
static void Main(string[] args)
{
    string[] newS = s.ArrayTo(() => string.Remove(0,1));
    foreach(string str in newS)
        Console.WriteLine(str);
}
static class Ext
{
    static T[] ArrayTo<T>(this T[] t,Action a)
    {
        List<T> ret = new List<T>();
        foreach(T tOb in t)
        {
            ret.Add(
            //t.a());  This line doesn't work
        }
        return ret.ToArray();
    }
}

输出:i , hello , hat's up

【问题讨论】:

  • 嗯...请解释反对票。
  • 您的问题不清楚,请尝试编辑您的答案,您的意思是什么:允许数组轻松地运行单个对象?我们很乐意为您提供帮助
  • 抱歉,没有代码我找不到另一种解释方式。请阅读我的代码以了解我的意思。
  • 扩展方法定义为静态方法,但使用实例方法语法调用。它们的第一个参数指定方法操作的类型,参数前面是“this”修饰符。你必须指定一个类型

标签: c# arrays generics delegates


【解决方案1】:

不要使用这个答案,只需使用 Select() 方法更简单。

class Program
{
    static void Main(string[] args)
    {
        string[] s = new string[] { "hi", "hello", "what's up" };
        string[] newS = s.ArrayTo<string>(x => x.Remove(0, 1) );
        foreach (string str in newS)
            Console.WriteLine(str);
    }
}
static class Ext
{
    public static T[] ArrayTo<T>(this T[] t, Func<T,T> a)
    {
        List<T> ret = new List<T>();
        foreach (T tOb in t)
        {
            ret.Add(
                a(tOb));
        }
        return ret.ToArray();
    }
}

【讨论】:

  • 所以... 一个冗长的方法来做 Select(Func).ToArray()?我不明白你为什么要创建ret,一个一个地添加项目,然后将它作为数组返回。只需创建数组(反正 t 的长度是已知的)并填充它。
  • 我刚刚试了一下,可以将ArrayTo的全部内容替换为:return t.Select(a).ToArray();实际上,首先使用 Select 可能更灵活,如果您不需要立即执行,则将其链接到另一个进程可能会更快
  • 问题是它适用于所有对象。这就是我从一开始就想做的事情。我的问题中的代码只是一个示例。
  • 嗯.. Select 适用于任何类型的所有 IEnumerables(数组、列表、字典等),并且它接受任何接受该类型的函数,它甚至不必返回相同类型(例如, var listOString = arrayOfInts.Select(int.Parse).ToList() ),更灵活
  • 好吧,我刚刚测试了它,你是对的。现在我不知道该怎么办。既然你回答了这个问题,你能不能把它作为答案让我接受。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-20
  • 2018-01-12
  • 1970-01-01
  • 2019-12-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多