拆分列表的元素并仅从拆分中检索第一部分

时间:2017-11-16 11:28:21

标签: c# list linq

我有一个清单说

List<string> someList = new List{"1-30","20-10","21-23","34-80"};

我需要拆分列表,所以我有以下值

 {"1","20","21","34"};

我试过

 someList
   .SelectMany(n => n.Split('-')[0])
   .ToList();

但它没有给我预期的结果。

更新 大家好,使用Select解决了我的问题。其中一天,当你犯了愚蠢的错误

3 个答案:

答案 0 :(得分:4)

你必须参加每个项目的第一部分,你可以在Substring的帮助下做到(即将项目的值提升到-) :

 List<string> someList = new List{
   "1-30", "20-100", "21-23", "34-80"};

 var result = someList
   .Select(item => item.Substring(0, item.IndexOf('-')))
   .ToList(); // if you want a new list

如果您想要更改现有列表,只需实现一个循环:

 for (int i = 0; i < someList.Count; ++i)
   someList[i] = someList[i].Substring(0, someList[i].IndexOf('-'));

修改:当您放置SelectMany而不是Select时会发生什么。

SelectMany想要IEnumerable<T>作为结果,因为StringIEnumerable<char>,所以你有一个展平List<char>

   ['1', '2', '0', '2', '1', '3', '4']

请注意,每个字符串("1", "20", "21", "34")都被视为字符的集合['1']; ['2', '0']; ['2', '1']; ['3', '4']

答案 1 :(得分:1)

您不需要使用selectMany,因为您不需要展平列表。使用Select将返回列表中的每个字符串

  

{“1-30”,“20-100”......等}

。使用SelectMany实际上会将字符串压缩成一系列字符,从而产生

  

{“1”,“ - ”,“3”,“0”......等}

所以你的分裂会导致错误的结果。

您只需选择列表中的每个项目,将项目拆分为“ - ”字符,然后从拆分中选择第一个结果。这应该会给你正确的结果。

List<string> someList = new List<string> { "1-30", "20-100", "21-23", "34-80" };
var splitString = someList.Select(x => x.Split('-').First()).ToList();

答案 2 :(得分:-1)

不像你想要的那么漂亮,但是它可以完成工作。

// Get a Handlebars instance
var hb = require("handlebars");

// Load a template
import fs = require('fs');
var template:string = fs.readFileSync('templates/template.handlebars','utf8');

// Compile said template
var compiled = hb.compile(template);
var html = compiled({});

// Write HTML file
fs.writeFileSync('compiled/template.html', html);