Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 针对多个拆分的LINQ查询的变化_C#_Linq - Fatal编程技术网

C# 针对多个拆分的LINQ查询的变化

C# 针对多个拆分的LINQ查询的变化,c#,linq,C#,Linq,我想把一个字符串转换成一个对象。 字符串的语法如下所示 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"

我想把一个字符串转换成一个对象。 字符串的语法如下所示

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查询被称为(name)的样式是什么,比如
(来自元素中的p)
,而不是
元素。调用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] };

谢谢:)

您可以使用
let
,类似这样的用法:

var elements = from p in nameIdPair.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.RemoveEmptyEntries)
               let arr = p.Split(':')
               select new { name = arr[0], id = arr[1] };
如果希望它返回
MyStruct
而不是匿名类对象,请尝试以下操作:

var elements = from p in nameIdPair.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.RemoveEmptyEntries)
               let arr = p.Split(':')
               select new MyStruct { Name = arr[0], Id = int.Parse(arr[1]) };
至于LINQ语法,我相信您的意思是fluent vs query expression


您可以在这里了解更多信息:

这里有一个只调用Split一次的解决方案。您可以将其粘贴到LINQPad中进行尝试。 我不认为LINQ中有一个等价的解压方法,但我很高兴了解到其他方法

此解决方案取决于不存在空名称或id条目

void Main()
{
    string nameIdPair = "name1:123\r\nname2:456\r\n";

    var strings = nameIdPair.Split(new string[]{ "\r\n", "\r", ":" }, 
                                   StringSplitOptions.RemoveEmptyEntries);
    var structs = strings.Unzip();

    structs.Dump();
}

public struct MyStruct
{
    public string Name;
    public int Id;
}

static class Helpers
{
    public static IEnumerable<MyStruct> Unzip(this IEnumerable<string> items)
    {
        using(var en = items.GetEnumerator())
        {
            string name = null;

            while(en.MoveNext())
            {
                if(name == null){
                    name = en.Current;
                }
                else{
                    int id = int.Parse(en.Current);
                    yield return new MyStruct{Name = name, Id = id};
                    name = null;
                }
            }
        }

        yield break;
    }
}
void Main()
{
字符串nameIdPair=“name1:123\r\nname 2:456\r\n”;
var strings=nameIdPair.Split(新字符串[]{“\r\n”,“\r”,“:”},
StringSplitOptions.RemoveEmptyEntries);
var structs=strings.Unzip();
structs.Dump();
}
公共结构MyStruct
{
公共字符串名称;
公共int Id;
}
静态类助手
{
公共静态IEnumerable解压(此IEnumerable项)
{
使用(var en=items.GetEnumerator())
{
字符串名称=null;
while(en.MoveNext())
{
if(name==null){
名称=en.Current;
}
否则{
int id=int.Parse(en.Current);
返回新的MyStruct{Name=Name,Id=Id};
name=null;
}
}
}
屈服断裂;
}
}