use*_*892 5 c# linq string ienumerable list
我有以下代码:
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();
Run Code Online (Sandbox Code Playgroud)
我想我的listSrc结果包含两个Info项目,其Name和Num属性是:
a, 1
b, 2
Run Code Online (Sandbox Code Playgroud)
但是,我上面显示的代码导致了四个项目:
a, 1
a, 2
b, 1
b, 2
Run Code Online (Sandbox Code Playgroud)
你可以使用Enumerable.Zip:
IEnumerable<Info> InfoSrc = s1.Split(',')
.Zip(s2.Split(','), (name, num) => new Info(){ Name = name, Num = num });
Run Code Online (Sandbox Code Playgroud)
如果您需要将两个以上的集合映射到属性,您可以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 });
Run Code Online (Sandbox Code Playgroud)
这是一个希望更具可读性的版本:
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]
});
Run Code Online (Sandbox Code Playgroud)
假设项目在每个列表的数量是相等的,它看起来像你试图邮编在一起......
s1.Split(',').Zip(s2.Split(','), (name, num) => new Info{Name = name, Num = num})
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
144 次 |
| 最近记录: |