2017-04-06 54 views
0

我有一个列表中的以下行类的(List<Row>)另一种名单:需要帮助转化的一种列表到使用LINQ

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来完成,但我不能将我的头围绕它!

在此先感谢。

+1

'var result =(sourceArray).Select(e => new Document {DocProp = e.SourceProp,....})' –

+0

请看看[how-to-ask](http:// stackoverflow.com/help/how-to-ask) – swe

回答

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与指定的Name(您可能会考虑使用FirstOrDefault代替,但这可能是“日期”的问题)。最后,如果“日期”FieldValue不是有效日期,那么DateTime.Parse将会丢失,取决于您可能需要使用DateTime.ParseExact的格式。

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. 
}