在列表中拆分字符串值<>;
本文关键字:lt gt 字符串 列表 拆分 | 更新日期: 2023-09-27 17:59:21
我有一个包含在字典中的列表,其中包含以下值
value a
value b
value c
value 1, value 2, value3
value d
我想要的最终结果是
value a
value b
value c
value 1
value 2
value 3
value d
问题是在字典中迭代并试图更改集合将不起作用,因为我试图在中循环时修改它
string[] ar;
foreach (var kvp in dict)
{
if (kvp.Key == "STAR-016")
{
foreach (var v in kvp.Value)
{
if (v.Contains(','))
{
ar = v.Split(',');
foreach (var a in ar)
{
kvp.Value.Add(a);
}
}
}
}
}
我怎样才能得到想要的结果?
尝试使用LINQ:
var list = new List<string>()
{
"value a",
"value b",
"value 1, value 2, value 3",
"value c"
};
/* THIS IS THE IMPORTANT PART: */
/* Replace list with kvp.Value */
list = list.SelectMany(
i => i.Split( ',' ).Select( v => v.Trim() )
).ToList();
foreach ( var item in list )
Console.WriteLine( item );
输出:
值a
值b
值1
值2
值3
值c
要在代码中使用此功能:
foreach (var kvp in dict)
{
if (kvp.Key == "STAR-016")
{
var newList =
kvp.Value.SelectMany(
i => i.Split( ',' ).Select( v => v.Trim() )
);
kvp.Value.Clear();
kvp.Value.AddRange(newList);
}
}
感谢@Mudu指出了更简单的i =>
语法
假设这只是一个例子,并且您实际上不仅希望对键STAR-016
这样做,而且希望对值(即List<string>
)包含逗号的所有值都这样做:
Dictionary<string, List<String>> dict = new Dictionary<string, List<String>>();
dict.Add("STAR-016", new List<string>() {
"value a", "value b", "value c", "value 1, value 2, value 3", "value d"
});
foreach (var kvp in dict)
{
for (int i = kvp.Value.Count - 1; i >= 0; i--)
{
string str = kvp.Value[i];
if (str.Contains(','))
{
var parts = str.Split(',').Select(p => p.Trim());
kvp.Value.RemoveAt(i);
kvp.Value.InsertRange(i, parts);
}
}
}
演示
我从结尾循环到开头,以避免出现复杂情况,因为InsertRange
将添加新的字符串,从而增加Count
我使用RemoveAt
将逗号字符串替换为添加的新字符串(逗号分隔的每个部分一个)。我用InsertRange
而不是AddRange
,因为你想保留订单。
结果:
value a
value b
value c
value 1
value 2
value 3
value d
您应该能够使用SelectMany
的一行代码来实现这一点。
dict["STAR-016"] = dict["STAR-016"].SelectMany(s=>s.Split(',')).ToList();
这将用逗号分隔字符串的列表替换键的列表,如果字符串不包含逗号,则只返回字符串。如果不希望由连续逗号产生空字符串,您也可以考虑使用StringSplitOptions.RemoveEmptyEntries
。
您可以使用for
而不是foreach
循环通过List
并修改项目
for (int i = 0; i < kvp.Value.Count; i++)
{
if (kvp.Value[i].Contains(','))
...
}
(编辑:juharr'shttps://stackoverflow.com/a/14875503/17713基本上与内置LINQ功能相同,并采用更具功能性的风格,这在描述实际问题时通常更具表现力)
我会选择yield
的一种方法,不会修改原始集合。以下是在List<string> orig
上操作的示例代码,该代码也可能在字典中:
public static void Main()
{
List<string> orig = new List<string>()
{
"value a",
"value b",
"value c",
"value 1, value 2, value 3",
"value d"
};
var result = Flatten(orig).ToList();
foreach(string s in result)
{
Console.WriteLine(s);
}
}
private static IEnumerable<string> Flatten(IList<string> orig)
{
foreach(string s in orig)
{
// split anyway, if there's no colon you just get a one-element
// array containing s, see
// http://msdn.microsoft.com/en-us/library/b873y76a.aspx
foreach(string v in s.Split(','))
{
yield return v.Trim();
}
}
}
在字典中,您可以将结果替换为原始值:
dict["STAR-016"] = Flatten(dict["STAR-016"]).ToList()
附带说明:上面的代码直接查找STAR-016
,而不是使用较慢的foreach
。如果您没有缩短代码,实际上只是在查找STAR-016
,我建议您使用这种字典查找方式。