如何使用for each或foreach迭代IEnumerable集合?

4

我想逐一添加值,但在for循环中如何逐个迭代值并将其添加到字典中。

IEnumerable<Customer> items = new Customer[] 
{ 
     new Customer { Name = "test1", Id = 111}, 
     new Customer { Name = "test2", Id = 222} 
};

i=0时,我想添加{ Name = "test1", Id = 111},当i=1时,我想添加{ Name = "test2", Id = 222},以此类推。

现在,我正在每个键中添加完整的集合。(希望使用foreach或for循环实现这一点)

public async void Set(IEnumerable collection)
{
   RedisDictionary<object,IEnumerable <T>> dictionary = new RedisDictionary>(Settings, typeof(T).Name);
// Add collection to dictionary;
   for (int i = 0; i < collection.Count(); i++)
   { 
     await dictionary.Set(new[] { new KeyValuePair<object,IEnumerable <T>  ( i ,collection) });
   }
}

2
现在不在电脑旁边,但我想你可以这样使用foreach:foreach(KeyValuePair<Settings, typeof(T).Name> item in dictionary) { // 使用item.Key和item.Value进行操作 } 如果有问题编译器会提示并告诉我错了。 - Paul Weiland
为什么你的键是一个对象而不是一个整数? - Po-ta-toe
1
你最终会用字典做什么? :) - knagaev
你为什么一开始就收到一个 IEnumerable,它本身没有索引器呢?看起来你想通过索引访问值? - Yuval Itzchakov
问题已经完美更新,请检查。 - Neo
显示剩余4条评论
4个回答

2
如果需要计数并且需要保留IEnumerable,则可以尝试以下方法:
int count = 0;
var enumeratedCollection = collection.GetEnumerator();
while(enumeratedCollection.MoveNext())
{
 count++;
 await dictionary.Set(new[] { new KeyValuePair<object,T>( count,enumeratedCollection.Current) });
}

2
你的foreach循环里的那个i是从哪儿来的呢? ;) - DangerousDetlef

1
新版本
var dictionary = items.Zip(Enumerable.Range(1, int.MaxValue - 1), (o, i) => new { Index = i, Customer = (object)o });

顺便说一下,"dictionary" 对于某些变量来说是一个不好的命名。


如果我理解你的意思 - 简单的枚举?从IEnumerable <Customer>创建带有索引键和对象值的字典? - knagaev

0

我已经使用完了

string propertyName = "Id";
    Type type = typeof(T);
                var prop = type.GetProperty(propertyName);
                foreach (var item in collection)
                {
                    await dictionary.Set(new[] { new KeyValuePair<object, T>(prop.GetValue(item, null),item) });
                }

-2

所以你想在for循环中将集合中的项添加到字典中吗? 如果你将你的 IEnumerable 强制转换为一个list或者array,就可以通过索引轻松地访问它。例如像这样: 编辑:代码在每次循环时都创建了一个新的list,这当然应该避免。

var list = collection.ToList(); //ToArray() also possible
for (int i = 0; i < list.Count(); i++)
{ 
  dictionary.Add(i, list[i]);
}

我不确定那是否是你需要的,如果你能提供更多问题细节就更好了。


4
这很糟糕。每次循环时,您都在创建一个列表。 - Po-ta-toe
我甚至不确定自己是否正确理解了他的问题,我只是匆忙写下了一点代码来展示给他看。不过我会进行编辑,因为你当然是对的,在每次迭代中都不应该创建一个列表。 - DangerousDetlef

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接