我有一个这样的数组:
Foo[] objects;
我想要KeyValuePair<Foo, float>
的{{1}}列表
第一个元素的objects
值为float
,并且应该按元素递增。它表示第一个元素的浮点值为0.2,第三个元素的浮点值为0.6。
完成此操作的for循环:
0.2f
我只是想知道有没有办法用LINQ和lambda表达式做到这一点?
答案 0 :(得分:8)
这是你要找的吗?
var myList = objects
.Select((f, index) => new KeyValuePair<Foo, float>(f, (index + 1) * 0.2f))
.ToList();
答案 1 :(得分:0)
如果这是重点,您可以更改开始value
,并有一行:
float value = 0.0f;
myList.AddRange(objects.Select(f =>
new KeyValuePair<Foo,float>(f, value += 0.2f)));
答案 2 :(得分:0)
使用Dictionary(也是KeyValuePair)
public void FooToLinq()
{
Foo[] objs = { new Foo(), new Foo(), new Foo() };
float value = 0.2f;
var dictionary = objs.ToDictionary(x => x, x => value += 0.2f);
foreach (KeyValuePair<Foo, float> pair in dictionary)
{
Console.WriteLine(pair);
}
}
输出是(我没有覆盖到字符串,所以它是namespace.class + nestedClass)
[StackOverflowTests.UnitTests+Foo, 0.4]
[StackOverflowTests.UnitTests+Foo, 0.6]
[StackOverflowTests.UnitTests+Foo, 0.8]
要使其成为一个列表,您有几个选项
myList = objs.ToDictionary(x => x, x => value += 0.2f).ToList();
//or to split the line up a little
var dictionary = objs.ToDictionary(x => x, x => value += 0.4f);
myList = dictionary.ToList();//option 2
myList.AddRange(dictionary);//option 3
无论哪种方式,您都可以获得所需的结果。正如其他人所指出的,如果你想确保索引与特定索引相关联,那么使用select方法。
答案 3 :(得分:-1)
最简短的答案是
var myDictionary= objects.Select((value, index) => new { index, value })
.ToDictionary(x => x.value, x => (x.index + 1) * .2f);
如果需要列表,请致电.ToList
var myList = myDictionary.ToList();