如何使用LINQ从逗号分隔的字符串列表中提取指定位置的项目



我有一个逗号分隔的字符串列表,我需要从所有字符串中提取第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();

相关内容

  • 没有找到相关文章

最新更新