1

您将如何转换此代码

poker_deck = [r+s for r in '23456789TJQKA' for s in 'SHDC']

到 C#?

我提出了这个:

char[] figures = "23456789TJQKA".ToCharArray();
char[] suites = "SHDC".ToCharArray();
List<string> deck = new List<string>();

foreach (var figure in figures)
{
    foreach (var suite in suites)
    {
        deck.Add(string.Format("{0}{1}", figure, suite));
    }
}

你怎么看?我想在一个简单易读的行中做同样的事情

4

2 回答 2

3

我认为 fluent LINQ 将是一个非常易读的解决方案以及最类似于您的原始 Python 代码的解决方案:

var cards = from r in "23456789TJQKA"
            from s in "SHDC"
            select "" + r + s;

当然也可以写成一行:

var cards = from r in "23456789TJQKA" from s in "SHDC" select "" + r + s;

因为我也编写 Python 代码,这让我很高兴,因为它几乎是您理解的文字翻译 :)

于 2012-04-21T10:15:40.633 回答
2

是的,这就是这样做的方法。如果您愿意,可以使用 LINQ 使其成为单线:

var deck = "23456789TJQKA".SelectMany(
               figure => "SHDC".Select(
                   suite => string.Format("{0}{1}", figure, suite))).ToList();

它做同样的事情,除了在这里你不必把套牌列在清单上。您可以根据需要将 ToList 更改为 ToArray,或将其保留为字符串的 IEnumerable。

这是作为扩展方法!

public static IEnumerable<TOut> Pair<T1, T2, TOut>(this IEnumerable<T1> items1, IEnumerable<T2> items2, Func<T1, T2, TOut> pairer)
{
    return items1.SelectMany(item1 => items2.Select(item2 => pairer(item1, item2)));
}

用法:

var deck = "23456789TJQKA".Pair("SHDC", (figure, suite) => string.Format("{0}{1}", figure, suite));
于 2012-04-21T09:44:25.200 回答