我有一个以分号分隔的字符串列表。
总会有一个偶数,因为第一个是键,下一个是值,
例如:
name;Milo;site;stackoverflow;
所以我分开了他们:
var strList = settings.Split(';').ToList();
但是现在我想使用foreach循环将它们放入List<ListItem>
我想知道是否可以通过迭代完成,或者我必须使用值'i'
来获取[i] and [i+1]
答案 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]);
}
}