我想将字符串转换为对象。该字符串采用以下语法。
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] };
谢谢 :)