1: public IEnumerabe<DocumentField> Adapt(IEnumerable<ScanMark> marks )
2: {
3: var fieldGroupMarkValues = (from mark in marks
4: let monikerParts = mark.Name.Split(new char[] {':'}, 2)
5: let groupName = monikerParts[0]
6: let markValue = mark.IsMarked ? monikerParts[1] : null
7: select new
8: {
9: FieldGroup = groupName,
10: Value = markValue
11: });
12: var fieldGroupValues = from markGroup in fieldGroupMarkValues
13: group markGroup by markGroup.FieldGroup
14: into fields
15: let monikerParts = fields.Key.Split(new char[] {'!'}, 2)
16: let fieldName = monikerParts[0]
17: let groupName = monikerParts[1]
18: let rawValue = ( from f in fields where null != f.Value select f.Value ).ToArray()
19: let zeroValue = ( ! rawValue.Any() ? " " : null )
20: let strayValue = 1 < rawValue.Count() ? "*" : null
21: let fieldValue = rawValue.FirstOrDefault()
22: select new
23: {
24: FieldName = fieldName,
25: GroupName = groupName,
26: Value = zeroValue ?? strayValue ?? fieldValue
27: };
28:
29: return from fieldGroup in fieldGroupValues
30: group fieldGroup by fieldGroup.FieldName into fields
31: let fieldName = fields.Key
32: let value = from g in fields select g.Value
33: select new DocumentField()
34: {
35: Name = fieldName,
36: Value = String.Join( "", value.ToArray() )
37: };
38:
39:
40: }