3

将数组 [1, 2, 3] 视为他的排列的一个实例。

在我的代码中,我需要将此值与我的变量相关联,以便我可以按名称引用它们

我正在尝试获取可读且简单的代码作为 Python 版本

在 Python 中,如果你有:

permutation = [2, 1, 3]

你可以做:

for (red, green, blue) in permutation
for (a, b, c) in permutation
if b is red

...

我需要做的是以完全相同的顺序将特定排列中的值与变量相关联:如果我有 [2, 1, 3] 排列和 (red, green, blue) 变量我想发生 red = 2 green =1蓝色 = 3

我认为在 C# 中可以通过 Dictionary 或 OrderedDictionary 来完成类似的事情,也许是具有有意义名称的 ExtensionMethod ......也许像 colors["red"] == letters["a"] 这样的东西可以

我试图勾勒出不同的实现,但我认为我遗漏了一些东西这就是我所勾画的:

enum ColorsEnum
{
    red, green, blue
}

public static Dictionary<string, int> Valorize(IEnumerable<string> keys, IEnumerable<int> values)
    {
           ...
    }

public static Dictionary<string, int> AsColorDictionaryWithValues(this string[] keys, int[] values)
{
           ...
}

public static void Valorize(Dictionary<string, int> dic, IEnumerable<int> values)
{
    foreach (var item in Enum.GetNames(typeof(ColorsEnum)))
    {
        dic.Add(item, [incremental_number]);
    }
}

你认为什么是好的解决方案(我关心可读性和简单性)

4

2 回答 2

4

您是否正在寻找这样的扩展方法?

public static void Do<T1, T2, T3>(this Tuple<T1, T2, T3> tuple,
                                  Action<T1, T2, T3> action)
{
    action(tuple.Item1, tuple.Item2, tuple.Item3);
}

用法:

var list = new List<Tuple<int, int, int>>
{
    Tuple.Create(255, 0, 0),
    Tuple.Create(0, 255, 0),
    Tuple.Create(0, 0, 255),
};

list.ForEach(t => t.Do((red, green, blue) =>
{
    Console.WriteLine("R: {0}, G: {1}, B: {2}", red, green, blue);
}));

输出:

R: 255, G: 0, B: 0
R: 0, G: 255, B: 0
R: 0, G: 0, B: 255
于 2012-04-26T11:09:58.280 回答
0

我已经整理了一个相当直接的扩展方法,我称之为ForEachBundle,来做你想做的事。

因此,例如,如果您有这个数组:

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

然后你ForEachBundle像这样打电话:

xs.ForEachBundle(
    (red, green, blue)
        => Console.WriteLine("{0}:{1}:{2}", red, green, blue));

结果是:

1:2:3
4:5:6

我假设如果在这个例子中可枚举有第七个值,它会忽略那个“额外”值。否则,如果您需要处理这种情况,您可以修改我的代码以使用默认值或可为空的类型。

这是我的定义ForEachBundle

public static void ForEachBundle<T>(
    this IEnumerable<T> @this,
    Action<T, T, T> action)
{
    if (@this == null) throw new System.ArgumentNullException("@this");
    var a = action;
    if (a == null) throw new System.ArgumentNullException("action");
    using (var en = @this.GetEnumerator())
    {
        while (true)
        {
            if (en.MoveNext())
            {
                var t0 = en.Current;
                if (en.MoveNext())
                {
                    var t1 = en.Current;
                    if (en.MoveNext())
                    {
                        var t2 = en.Current;
                        a(t0, t1, t2);
                    }
                    else break;
                }
                else break;
            }
            else break;
        }
    }
}

让我知道这是否符合您的要求。


这是一个为不完整的“捆绑包”添加默认值的版本:

public static void ForEachBundle<T>(
    this IEnumerable<T> @this,
    Action<T, T, T> action)
{
    if (@this == null) throw new System.ArgumentNullException("@this");
    var a = action;
    if (a == null) throw new System.ArgumentNullException("action");
    using (var en = @this.GetEnumerator())
    {
        while (en.MoveNext())
        {
            var t0 = en.Current;
            var t1 = en.MoveNext() ? en.Current : default(T);
            var t2 = en.MoveNext() ? en.Current : default(T);
            a(t0, t1, t2);
        }
    }
}
于 2012-04-26T12:17:34.360 回答