通过迭代数组来创建KeyValuePair列表

时间:2015-04-08 13:43:49

标签: c# .net linq

我有一个这样的数组:

Foo[] objects;

我想要KeyValuePair<Foo, float>的{​​{1}}列表 第一个元素的objects值为float,并且应该按元素递增。它表示第一个元素的浮点值为0.2,第三个元素的浮点值为0.6。

完成此操作的for循环:

0.2f

我只是想知道有没有办法用LINQ和lambda表达式做到这一点?

4 个答案:

答案 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();