【问题标题】:Extract list of objects from a string using linq使用 linq 从字符串中提取对象列表
【发布时间】:2013-05-17 15:40:46
【问题描述】:

我是 linq 的新手。我有一个具有以下格式的字符串

code:description;code2:description2;code3:description3... etc.

记录用;字符分隔,每条记录有2个字段用:字符分隔。

我正在编写一个 linq 查询来提取具有字段代码和描述的对象列表。 我编写了以下查询,它似乎产生了正确的结果,但我想知道是否有更好或更正确的方法来做到这一点。

var objects =
    from objString in recsString.Split(';')
    let obj = objString.Split(':')
    select new {
        Code = obj[0].Trim(),
        Description = obj[1].Trim()
    };

【问题讨论】:

  • 您的“对象”是否在您的项目中定义为它自己的类。如果是这样,您可以在 select 语句中调用构造函数。 IE - 选择新记录(代码,描述);
  • 不,它是匿名的,如果我看到我需要它,我会创建一个类,但现在已经足够了。
  • 如果您的代码或描述中有:;,或者任何条目为空或半空,这将不起作用。除此之外,它很好。
  • @DavidS。幸好没有这样的情况。

标签: c# linq


【解决方案1】:

这很好,但我唯一的观察是您使用 StringSplitOptions 删除空条目:

var objects =
from objString in recsString.Split(';', StringSplitOptions.RemoveEmptyEntries)
let obj = objString.Split(':', StringSplitOptions.RemoveEmptyEntries)
select new {
    Code = obj[0].Trim(),
    Description = obj[1].Trim()
};

如果您认为可能缺少信息,您也可以额外安全null检查结果:

var objects =
from objString in recsString.Split(';', StringSplitOptions.RemoveEmptyEntries)
let obj = objString.Split(':', StringSplitOptions.RemoveEmptyEntries)
select new {
    Code = obj.Any() ? obj[0].Trim() : string.Empty,
    Description = obj.Count > 1 ? obj[1].Trim() : string.Empty
};

【讨论】:

  • 好吧!感谢您的额外建议。
【解决方案2】:

你正在做的很好,下面是你如何使用 lambdas 编写它:

string objString = "code:description;code2:description2;code3:description3";

Dictionary<string, string> results =
    objString.Split(';')
             .Select(x => x.Split(':'))
             .ToDictionary(key => key[0], value => value[1]);

// And now you have a nice little dictionary
foreach (var r in results)
    Console.WriteLine("{0}:{1}",r.Key, r.Value);

当然也可以:

    var results = objString.Split(';')
                           .Select(x => x.Split(':'))
                           .Select(x => new {Code = x[0], Description = x[1]});

    foreach (var r in results)
        Console.WriteLine("{0}:{1}",r.Code, r.Description);

【讨论】:

  • 不错的方法。对象列表现在更适合我的需求。
  • 当然,我虽然不同的前景可能有用:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多