c# - 将多个字符串拆分为 C# 中的对象列表

标签 c# string linq list ienumerable

我有以下代码:

public class Info
{
  public string Name;
  public string Num;
}

string s1 = "a,b";
string s2 = "1,2";

IEnumerable<Info> InfoSrc =
    from name in s1.Split(',')
    from num in s2.Split(',')
    select new Info()
    {
        Name = name,
        Num = num
    };

List<Info> listSrc = InfoSrc.ToList();

我希望我的 listSrc 结果包含两个 Info 项,它们的 NameNum 属性是:

a, 1
b, 2

但是,我上面显示的代码产生了四个项目:

a, 1
a, 2
b, 1
b, 2

最佳答案

您可以使用Enumerable.Zip:

IEnumerable<Info> InfoSrc = s1.Split(',')
    .Zip(s2.Split(','), (name, num) => new Info(){ Name = name, Num = num });

如果您需要将两个以上的集合映射到属性,您可以将多个 Zip 与一个包含第二个和第三个的匿名类型链接在一起:

IEnumerable<Info> InfoSrc = s1.Split(',')
    .Zip(s2.Split(',').Zip(s3.Split(','), (second, third) => new { second, third }),
        (first, x) => new Info { Name = first, Num = x.second, Prop3 = x.third });

希望这是一个更具可读性的版本:

var arrays = new List<string[]> { s1.Split(','), s2.Split(','), s3.Split(',') };
int minLength = arrays.Min(arr => arr.Length);  // to be safe, same behaviour as Zip
IEnumerable<Info> InfoSrc = Enumerable.Range(0, minLength)
 .Select(i => new Info
 {
     Name = arrays[0][i],
     Num = arrays[1][i],
     Prop3 = arrays[2][i]
 });

关于c# - 将多个字符串拆分为 C# 中的对象列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33675422/

相关文章:

c# - AESCryptoServiceProvider 在禁运国家是否可用

ios - 如何在 swift 中转换一个 nil 字符串

c# - 在 LINQ 中使用 Union 合并列表时删除重复项

c# - 在 WPF 的组合框中显示 MySQL 数据库的列?我只显示 'System.Data.DataRowView'

c# - 转换纹理(绘制为平面 3D 对象)以模拟深度时,黑线随机出现

c# - MonoGame 管道工具是否不再包含在 Visual Studio MonoGame NuGet 包中?

java - 在较少重复的代码或高效但重复的代码之间进行选择

java - 使用 printf() 将输出格式化为网格

c# - LINQ to SQL 将查询结果存储在变量中

c# - 使用LINQ插入 block 到SQL?