我有一个逗号分隔的字符串列表,我需要从所有字符串中提取第1项和第3项。
List<string> list = new List<string>()
{
"1,2,3",
"4,5,6",
"7,8,9",
"10,11,12"
};
List<Tuple<string, string>> parsed = new List<Tuple<string, string>>(list.Count);
foreach (string s in list)
{
string[] items = s.Split(',');
parsed.Add(new Tuple<string, string>(items[0], items[2]));
}
Console.WriteLine(string.Join(Environment.NewLine, parsed.Select(p => p.Item1 +","+ p.Item2)));
Console.ReadLine();
结果:
1,3
4,6
7,9
10,12
但当我尝试使用LINQ编写它时,我找不到比更简单的东西了
IEnumerable<Tuple<string, string>> parsed = list.Select(
s =>
{
string[] items = s.Split(',');
return new Tuple<string, string>(items[0], items[2]);
});
我想知道是否可以去掉{}
块,用LINQ函数调用来代替它。需要明确的是,我提出这个问题只是为了增加我对LINQ特性和功能的了解,因此,任何建议都是受欢迎的。
编辑:
到目前为止,所有建议的代码都调用了split
函数两次。有没有一种方法可以只调用一次就得到所需的结果?类似于:
var parsed = list.Select(s => s.Split(',').Magic(...));
另外,上面的代码示例并不是指第一项和最后一项。我指的是指定位置的项目。
如果您使用的是C#7或更高版本,那么您甚至可以用更简单的方式编写
IEnumerable<Tuple<string, string>> parsed = list.Select(
s => (s.Split(',')[0], s.Split(',')[2]));
你可以在下面做一些类似的事情
IEnumerable<Tuple<string, string>> parsed = list.Select(
s =>
{
var spl = s.Split(',');
return new Tuple<string, string>(spl[0], spl[2]);
// return new MyClass(spl[0], spl[2], ... ,spl[n]);
});
如果您想通过删除中间数字来返回,
分隔的列表,您可以使用Regex
来替换它。
IEnumerable<string> afterUpdate = list.Select(s => Regex.Replace(s, @",[0-9]*,", ","));
输出将为
{
"1,3",
"4,6",
"7,9",
"10,12"
};
这可能会有所帮助。。。
//----------------Linq.----------------------
//Data Source
var source = new List<string> { "1,2,3", "4,5,6", "7,8,9", "10,11,12" };
//var sourceTest = new List<string> { "11,45,6,5,", "2,3,4,5,6", "1,7,40,30", "10,20,30,40,50" };
//var sourceTest2 = new List<string> { "15,12,11,45,6,5,", "1,2,3,4,5,6", "1,7,9,40,30", "60,20,70,80,90,100" };
//Query Creation
var queryLambda = source.Select(item => new
{
FirstItem = item.Split(',').FirstOrDefault(),
ThirdItem = item.Split(',').Skip(2).FirstOrDefault()
}).ToList();
var query = (from items in source
select new
{
FirstItem = items.Split(',').FirstOrDefault(),
ThirdItem = items.Split(',').Skip(2).FirstOrDefault()
}).ToList();
//Query Execution
queryLambda.ForEach(item => { Console.WriteLine(string.Join(",", new string[] { item.FirstItem, item.ThirdItem })); });
Console.WriteLine();
query.ForEach(item => { Console.WriteLine(string.Join(",", new string[] { item.FirstItem, item.ThirdItem })); });
Console.ReadLine();