正确的迭代方法?

时间:2013-04-11 16:58:32

标签: c# asp.net

我有一个以分号分隔的字符串列表。

总会有一个偶数,因为第一个是键,下一个是值,

例如:

name;Milo;site;stackoverflow;

所以我分开了他们:

 var strList = settings.Split(';').ToList();

但是现在我想使用foreach循环将它们放入List<ListItem>

我想知道是否可以通过迭代完成,或者我必须使用值'i'来获取[i] and [i+1]

6 个答案:

答案 0 :(得分:4)

可以使用LINQ完成,但我不确定这个更好

var dict = input.Split(';')
            .Select((s, i) => new { s, i })
            .GroupBy(x => x.i / 2)
            .ToDictionary(x => x.First().s, x => x.Last().s);

您也可以使用moreLinq的批处理

var dict2 = input.Split(';')
            .Batch(2)
            .ToDictionary(x=>x.First(),x=>x.Last());

答案 1 :(得分:3)

我无法编译,但这应该适合你:

var list = new List<ListItem>();
for (int i = 0; i < strList.Count; i++)
{
    i++;
    var li = new ListItem(strList[i - 1], strList[i]);
    list.Add(li);
}

再一次,我无法完全重新创建你的环境,但由于第一个是键,第二个是值,你确定字符串的状态,这是一个非常简单的算法。

但是,利用foreach循环仍然需要您更多地了解索引,因此使用基本的for循环可以更直接。

答案 2 :(得分:1)

首先,我使用了一个有价值的辅助函数。它类似于GroupBy,除了它按顺序索引而不是某些键分组。

    public static IEnumerable<List<T>> GroupSequential<T>(this IEnumerable<T> source, int groupSize, bool includePartialGroups = true)
    {
        if (groupSize < 1)
            throw new ArgumentOutOfRangeException("groupSize", groupSize, "Must have groupSize >= 1.");
        var group = new List<T>(groupSize);
        foreach (var item in source)
        {
            group.Add(item);
            if (group.Count == groupSize)
            {
                yield return group;
                group = new List<T>(groupSize);
            }
        }
        if (group.Any() && (includePartialGroups || group.Count == groupSize))
            yield return group;
    }

现在你可以简单地做

var listItems = settings.Split(';')
    .GroupSequential(2, false)
    .Select(group => new ListItem { Key = group[0], Value = group[1] })
    .ToList();

答案 3 :(得分:0)

如果你想使用foreach

string key=string.Empty;
    string value=string.Empty;

    bool isStartsWithKey=true;
    var strList = settings.Split(';').ToList()

    foreach(var item in strList)
    {
      if(isStartsWithKey)
      {
        key=item;
      }
      else
      {
        value=item;
        //TODO: now you can use key and value
      }

      isStartsWithKey=!isStartsWithKey;
    }

答案 4 :(得分:0)

List<int, string> yourlist;
for(int i=0;i<strList.length/2;i++)
{
  yourlist.add(new ListItem(strList[i*2], strList[i*2+1]));
}

答案 5 :(得分:-1)

这在我看来是最简单的方式

for(var i = 0; i < strList.Count(); i = i + 2){
    var li = new listItem (strList[i], strList[i + 1];
    listToAdd.Add(li);
}

更新了示例

for (var i = 0; i < strList.Count(); i = i + 2){

    if (strList.ContainsKey(i) && strList.ContainsKey(i + 1)){
        listToAdd.Add(new listItem(strList[i], strList[i + 1]);
    }
}