我想将字符串转换为对象。该字符串采用以下语法。
string nameIdPair = "name1:123\r\nname2:456\r\n";
并说我想要将其转换为的对象定义如下。
public struct MyStruct
{
public string Name;
public int Id;
}
我想出了以下查询
var elements = nameIdPair.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.RemoveEmptyEntries)
.Where(p => !string.IsNullOrWhiteSpace(p))
.Select(r => r.Split(':'))
.Select(s => ReturnObject(s));
另外我更喜欢编写 sql 类型的 linq 查询,所以我想我会拆分上面的查询并提出以下解决方案
var elements = from p in nameIdPair.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.RemoveEmptyEntries)
where !string.IsNullOrWhiteSpace(p)
select ReturnObject(p); // Here p is string not string[]
而且我不想调用辅助函数:-
string[] tempContainer = new string[] { };
var elements = from p in nameIdPair.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.RemoveEmptyEntries)
where (tempContainer = p.Split(':')) != null
select new { name = tempContainer[0], id = tempContainer[1] };
private static object ReturnObject(string inputString)
{
string[] value = inputString.Split(':');
myObject.Name = value[0];
myObject.Id = int.Parse(value[1]);
return myObject;
}
请注意,在最后一个查询中,我使用了一个 dummyContainer 并调用 Where() 只是为了加载 dummyContainer。我想在不使用虚拟变量或外部函数调用的情况下重写最后一个查询,但是我无法提出可行的解决方案。
我可以写如下
var elements = from p in nameIdPair.Split(new string[] { "\r\n", "\n" },StringSplitOptions.RemoveEmptyEntries)
select new { name = p.Split(':')[0], id = p.Split(':')[1] };
但是在这里我一次又一次地对同一个字符串进行拆分操作,我该如何避免这种情况,没有临时变量。我也忘记了这些风格的 LINQ 查询称为(名称),(from p in elements)
而不是elements.Select()
被调用。
另外我想知道如何在不调用
ReturnObject
函数的情况下重写这篇文章中的第一个查询
我进一步研究发现let
var items = from p in nameIdPair.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.RemoveEmptyEntries)
let r = p.Split(':')
select new { name = r[0], id = r[1] };
谢谢 :)