List<逗号分隔的字符串> => List<字符串>?

12

我试图用 LINQ 的方式来处理这个问题,但却想不出什么好的方法。

我有一个对象列表 List<>,其中包括一个属性,该属性是逗号分隔的字母代码列表:

lst[0].codes = "AA,BB,DD"
lst[1].codes = "AA,DD,EE"
lst[2].codes = "GG,JJ"

我希望获得那些代码的清单,希望是字符串列表的形式:

result = AA,BB,DD,EE,GG,JJ

感谢任何指引。


5
类似于这样的 lst.SelectMany(x => x.Split(',')).Distinct().ToList(),但需要更好的 CSV 解析... - Adriano Repetti
@AdrianoRepetti,这取决于数据是否来自CSV文件。OP没有说字符串是否包含转义逗号。 - Jodrell
谢谢,@AdrianoRepetti。对于这些目的来说,简单的string.split()足以进行解析。 - john paz
@Jodrell 我同意,但是我觉得最好还是提醒他 String.Split() 不是 CSV 解析(以防万一...) - Adriano Repetti
4个回答

21

使用SelectMany获取所有的分割代码,然后使用Distinct来避免重复值。

尝试像这样做:

var result = lst.SelectMany(x => x.codes.Split(",")).Distinct().ToList();

谢谢,@Joel。我以前从没用过SelectMany()。 - john paz
@johnpaz 当然,你明确要求一个 List<>,但你也可以使用一个集合或其他东西,它不能有重复项,例如 var result = new SortedSet<string>(lst.SelectMany(x => x.codes.Split(","))); - Jeppe Stig Nielsen
这真的很好。但是,我有一个问题:为什么要使用.Distinct()?用户是否要求它是唯一的?在第二个lst[1].codes索引中,您不会删除AA吗? - Mark Buffalo
1
@MarkBuffalo:在原始问题中,AA和DD项目在输入中出现了两次,但在输出中只出现了一次。逻辑上的结论是原贴作者希望消除重复。 - Eric Lippert
@johnpaz:仔细研究SelectMany的可用重载版本将会带来回报;在某种意义上,它是序列上的基础操作。作为一项练习:你能否只使用SelectMany实现与Select相同的功能?那么Where呢?Join呢?虽然这些都不如专门构建的等效操作快,但这个练习说明了SelectMany是你工具箱中强大的工具。 - Eric Lippert

6
你需要使用 Split 函数将每个字符串拆分成多个字符串。接着,你需要使用 SelectMany 函数将多个序列连接成一个序列,然后使用 Distinct 函数去重。
var result =
    lst
    .SelectMany(x => x.codes.Split(','))
    .Distinct()
    .ToList();

0
如果你需要一个字符串作为结果:
string result = string.Join(",",lst.SelectMany(p=>p.codes.Split(",")).Distinct());

-1

试试这个:

  List<string> list = new List<string>();

  char[] sep = new char[1];
  sep[0] = ',';
  foreach (string item in lst)
  {
       list.AddRange(item.Split(sep));
  }

  list = list.Distinct().ToList();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接