【问题标题】:Linq query selecting comma separated listLinq 查询选择逗号分隔列表
【发布时间】:2013-01-23 10:08:17
【问题描述】:

我有一个对象列表,其中对象具有一个字符串属性,该属性是一个逗号分隔的数字 ID 列表。

提取逗号分隔值并获取 int 数组的最有效方法是什么?

目前我的解决方案是这样的:

var allCsvs = objects
    .Select(o => o.IdCsv); // the IdCsv is a string property, ie "1,2,3,4,5"
var allIds = string.Join(",", allCsvs);
var idArray = allIds.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
    .Select(id => Convert.ToInt32(id));

关于如何提高性能的任何想法?

更新:

对象可能如下所示:

class MyClass {
    public string IdCsv { get; set; }
}

并且此类的一个实例可能会将其字符串属性IdCsv 设置为如下内容:"1,2,3,4,5"

【问题讨论】:

  • 只是为了理解,IdCsv 已经是一串逗号分隔的 id 了吗?
  • .Select(id => Convert.ToInt32(id));; 这部分不在您原来的问题中,这让我觉得您想将字符串列表解析为 int 数组。
  • 请告诉我们objects后面的类,IdCsv是什么?

标签: c# algorithm


【解决方案1】:

试试这个:

internal class Csv
{
    public string CommaSepList { get; set; }
}


var allCsvs =
    new List<Csv>
        {
            new Csv
                {
                    CommaSepList = "1,2,3,4,,5"
                },
            new Csv
                {
                    CommaSepList = "4,5,7,,5,,"
                },
        };

int[] intArray =
    allCsvs
        .SelectMany(c => c.CommaSepList.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
        .Select(int.Parse)
        .ToArray();

或者

int[] intArray =
    allCsvs
        .SelectMany(c => c.CommaSepList.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries).Select(int.Parse))
        .ToArray();

【讨论】:

  • 仅当idCSV 是字符串而不是IEnumerable&lt;string&gt; 时才有效。
  • @TimSchmelter From OP "// IdCsv 是一个字符串属性,即"1,2,3,4,5""
  • 为澄清起见 :) 第一句包含您需要知道的所有内容“我有一个对象列表,其中该对象有一个字符串属性,它是一个逗号分隔的数字 ID 列表”
  • 我检查了所有的解决方案,看起来这比另一个快一点,而且更短一点。
  • 当我评论蒂姆的回答时,我已经尝试了这个解决方案。事实上,这是我的第一个解决方案。在每次迭代中执行字符串拆分比我在问题中的解决方案更糟糕。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-18
相关资源
最近更新 更多