需要帮助使用LINQ

时间:2017-04-06 12:54:27

标签: c# linq

我有以下Row类的列表(List<Row>)

public class Row
{
    public List<Field> fields { get; }

    public Row()
    {
        fields = new List<Field>();
    }

    public void AddField(Field field)
    {
        fields.Add(field);
    }
}

public class Field
{
    public string Name { get; }
    public string Value { get; }

    public Field(string name, string value)
    {
        this.Name = name;
        this.Value = value;
    }
}

我想将其转换为以下格式的列表List<Document>

public class Document
{
    public string Id { get; set; }
    public string PubId { get; set; }
    public Date Date { get; set; }
}

其中“Id”是递增计数器,PubId对应Name: "PubId", Value: "SomeValue",而日期对应Name: "Date", Value: "SomeDate"

我知道这可以使用LINQ完成,但我无法绕过它!

提前致谢。

2 个答案:

答案 0 :(得分:3)

如果我理解正确,你想要像

这样的东西
var docList = rowList.Select((r,i) => new Document
{
    Id = (i + 1).ToString(),
    PubId = r.fields.First(f => f.Name == "PubId").Value,
    Date = DateTime.Parse(r.fields.First(f => f.Name == "Date").Value)
}).ToList();

首先关闭Select重载,我使用包含索引,我假设您希望第一个Id为1而不是0.其次使用First是如果找不到具有指定Field的{​​{1}},则会抛出异常(您可能会考虑使用Name代替,但这对于&#34;日期&#34可能会有问题)。最后,如果&#34;日期&#34; FirstOrDefault Value不是Field将投掷的有效日期,具体取决于您可能需要使用DateTime.Parse的格式。

答案 1 :(得分:1)

List<Row> rows = GetRows();
int i =0;
List<Document> docs = rows.Select(r => new Document()
{ 
    Id = (i++).ToString(), 
    PubId = r.fields.Where(f => f.Name == "PubId").Select(f => f.Value).FirstOrDefault(), 
    Date = GetDate(r.fields.Where(f => f.Name == "Date").Select(f => f.Value).FirstOrDefault()) 
}).ToList();

public Date GetDate(string input)
{
  // Convert Here.
}