【问题标题】:How to iterate through IEnumerable collection using for each or foreach?如何使用 for each 或 foreach 遍历 IEnumerable 集合?
【发布时间】:2015-08-24 06:50:33
【问题描述】:

我想一一添加值,但在 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 n 时添加{ Name = "test2", Id = 222} 等等..

现在我正在为每个键添加完整的集合。(希望使用 foreach 或 forloop 来实现)

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) });
   }
}

【问题讨论】:

  • 现在不在电脑上,但我想你可以这样 foreach 它: foreach(KeyValuePair item in dictionary) { // 用 item 做事.Key 和 item.Value } 如果不是编译器会告诉你并称我错了。
  • 参数“string Key”是什么意思?
  • @knagaev 抱歉更新了混乱..
  • 为什么你的key是object而不是in?
  • 你到底用字典做什么? :)

标签: c# dictionary ienumerable ienumerator


【解决方案1】:

如果需要计数并且要维护IEnumerable,那么你可以试试这个:

int count = 0;
var enumeratedCollection = collection.GetEnumerator();
while(enumeratedCollection.MoveNext())
{
 count++;
 await dictionary.Set(new[] { new KeyValuePair<object,T>( count,enumeratedCollection.Current) });
}

【讨论】:

  • 你的 foreach 循环中的i 是从哪里来的? ;)
【解决方案2】:

新版本

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

顺便说一句,字典对于某些变量来说是个坏名字。

【讨论】:

  • 如果我明白你想要什么 - 简单的枚举?带有来自 IEnumerable? 的索引键和对象值的字典
【解决方案3】:

我用完了

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) });
                }

【讨论】:

    【解决方案4】:

    所以你想在 for 循环中将集合中的一个项目添加到字典中? 如果您将IEnumerable 转换为列表或数组,则可以通过索引轻松访问它。例如像这样: 编辑:代码首先在每次循环时创建一个列表,这当然应该避免。

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

    不过,如果这是您需要的,我不是 100%。你的问题的更多细节会很棒。

    【讨论】:

    • 这太糟糕了。每次循环时都会创建一个列表
    • 我什至不知道他的问题是否正确,我只是草草写下一点代码来告诉他怎么做。不过我会编辑它,因为你当然是对的,不应该在每次迭代中都创建一个列表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 2010-12-19
    • 1970-01-01
    • 2011-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多