我有一个收藏品。 coll有字符串:
Location="Theater=2, Name=regal, Area=Area1"
等等。我必须从字符串中提取名称位。例如,在这里我必须提取文本'regal'
我正在努力解决这个问题:
Collection.Location。???? (这里要添加什么)
哪种方法最简短,最精确?
[编辑]:如果我必须添加到GroupBy子句
,该怎么办?Collection.GroupBy(????);
答案 0 :(得分:3)
扩展保罗的回答:
var location = "Theater=2, Name=regal, Area=Area1";
var foo = location
.Split(',')
.Select(x => x.Split('='))
.ToDictionary(x => x[0].Trim(), x => x[1]);
Console.WriteLine(foo["Name"]);
这会将原始字符串填充到字典中以便于参考。再次,没有错误检查或任何事情。
答案 1 :(得分:2)
Location.Split(",").Select(x => x.Split("=")[1])
这是非常懒惰,完全没有错误处理的方式:)
答案 2 :(得分:2)
快速而肮脏的方式是简单的IndexOf / Substring提取:
string location = "Theater=2, Name=regal, Area=Area1";
int startPos = location.IndexOf("Name=") + 5;
int endPos = location.IndexOf(",", startPos);
string name = location.Substring(startPos, endPos - startPos);
答案 3 :(得分:2)
如果Regex是一个选项,您可以使用环视构造来获得精确匹配。我在下面使用的示例应该在c#中运行良好。关于这一点的好处是,即使在名称部分之前添加了更多以逗号分隔的项目,它仍将继续工作。
System.Text.RegularExpressions.Match m =
System.Text.RegularExpressions.Regex.Match(
"Theater=2, Name=regal, Area=Area", @"(?<=Name=)[a-zA-Z0-9_ ]+(?=,)");
Console.WriteLine(m.Value);
答案 4 :(得分:1)
另一种LINQ风格的答案(没有字典的开销):
var name = (from part in location.Split(',')
let pair = part.Split('=')
where pair[0].Trim() == "Name"
select pair[1].Trim()).FirstOrDefault();
重新分组(编辑):
var records = new[] {
new {Foo = 123, Location="Theater=2, Name=regal, Area=Area1"},
new {Foo = 123, Location="Name=cineplex, Area=Area1, Theater=1"},
new {Foo = 123, Location="Theater=2, Area=Area2, Name=regal"},
};
var qry = from record in records
let name = (from part in record.Location.Split(',')
let pair = part.Split('=')
where pair[0].Trim() == "Name"
select pair[1].Trim()).FirstOrDefault()
group record by name;
foreach (var grp in qry)
{
Console.WriteLine("{0}: {1}", grp.Key, grp.Count());
}