将数组[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]);
}
}
您认为什么是一个好的解决方案(我关心可读性和简单性)
答案 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);
}
}
}