迭代地将值与C#中的变量相关联,就像[2,1,3]中的(红色,绿色,蓝色)python一样

时间:2012-04-26 10:54:40

标签: c#

将数组[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]排列和(红色,绿色,蓝色)变量,我想要发生 红= 2 绿色= 1 蓝色= 3

我认为在C#中可以通过Dictionary或OrderedDictionary实现类似的东西,也许是具有有意义名称的ExtensionMethod ...... 也许类似颜色[“red”] ==字母[“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]);
    }
}

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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);
        }
    }
}