繁体   English   中英

相当于 C# 中 php 的 list()

[英]equivalent to list() of php in C#

C# 中有一些方法等于 php 的 list() 吗?

PHP 中的使用列表()

$array = array('foo','baa'); 
list($foo, $baa)  = $array; 

echo $foo; //foo
echo $baa; //baa

javascript 中的等效项:

var arr = ['foo','baa']; 
var foo;
var baa; 
[foo, baa] = arr; 

提前致谢!

C# 中没有直接的语言等效项。 虽然集合初始值设定项可用于构造数组,但无法直接提取元素。

这需要显式设置变量,即:

var theArray = GetArrayFromSomewhere();
var foo = theArray[0]; 
var bar = theArray[1];

这更类似于初衷,尽管有些人可能不喜欢所有的仪式:

string a = null, b = null, c = null;

new ValList(v => a = v,
            v => b = v,
            v => c = v).SetFrom(new string[] { "foo", "bar" });

//here a is "foo", b will be "bar", and c is still null

还有简单的助手 class:

class ValList
{
    private Action<string>[] _setters;

    public ValList(params Action<string>[] refs)
    {
        _setters = refs;
    }

    internal void SetFrom(string[] values)
    {
        for (int i = 0; i < values.Length && i < _setters.Length; i++)
            _setters[i](values[i]);
    }
}

只是将@Yoni 的答案添加到扩展方法中。 这是一个可爱而愚蠢的练习; 但是,正如评论和答案中所指出的那样,某些语言功能根本无法从一种语言移植到另一种语言。

在 PHP 中, list($a, $b) = $c构成一个赋值,并且由于不需要变量声明( list()声明),它可以提供简洁明了的赋值语法。

然而,在 C# 中,由于在使用之前需要声明变量,因此您最好在那时简单地从列表中分配值,如下面的示例所示。

说到,传入的例子:

public static void Into<TSource>(this IEnumerable<TSource> source,
    params Action<TSource>[] actions) 
{
    if (ReferenceEquals(source, null)) {
        throw new ArgumentNullException("source");
    }
    if (ReferenceEquals(actions, null)) {
        throw new ArgumentNullException("actions");
    }
    foreach (var assignment in actions.Zip(source, (action, item) => new {
        Action = action,
        Item = item,
    })) {
        assignment.Action.Invoke(assignment.Item);
    }
}

所以你可以简单地collection.Into(o => a = o, o =>...); 例如:

var numbers = new[] { 1, 2, 3, 4, 5 };

int a = 0, b = 0, c = 0, d = 0;
int e = 0, f = 0, g = 0, h = 0, i = 0, j = 0;

numbers.Into(o => a = o,
             o => b = o,
             o => c = o,
             o => d = o);

numbers.Into(o => e = o,
             o => f = o,
             o => g = o,
             o => h = o,
             o => i = o,
             o => j = o);

这将产生:

Console.WriteLine(a); // 1
Console.WriteLine(b); // 2
Console.WriteLine(c); // 3
Console.WriteLine(d); // 4
Console.WriteLine(e); // 1
Console.WriteLine(f); // 2
Console.WriteLine(g); // 3
Console.WriteLine(h); // 4
Console.WriteLine(i); // 5
Console.WriteLine(j); // 0

也许某些Expression<>魔术可以将其缩短为:

numbers.Into(o => a,
             o => b,
             ... )

在 C# 中执行原始 php(我对 PHP 一无所知)任务的一种方法是

        List<string> name_list = new List<string>{"transmogrify","untransmogrify"};
        name_list.ForEach(x => Debug.WriteLine(x));

这导致了更一般的观察,即 C# 允许您在将变量保留在数组或列表中的同时做很多事情。 特别是 LINQ 使许多事情变得非常简单。 因此,如果您正在寻找一种在 C# 中复制一些 PHP 代码的方法,我会以这些方式思考。 只是一个分开的例子,如果你有一个整数数组你想求和你可以这样做

       int[] some_ints = {1, 2, 3, 4};
       int sum += some_ints.Sum();

正如Reed所说,C# 中没有直接的语言等价物。

但是你可以像下面这样创建它↓

class Program
{
    static void Main(string[] args)
    {

        string[] tmp = new string[] { "foo", "baa" };

        string foo, baa;
        tmp.Go(out foo, out baa);

        Console.WriteLine(foo);
        Console.WriteLine(baa);

        Console.ReadKey();
    }
}

public static class PHPList
{
    public static void Go(this string[] soruce, out string p1, out string p2)
    {
        p1 = soruce[0] + "";
        p2 = soruce[1] + "";
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM