-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathEnumerableExtensions.cs
More file actions
137 lines (121 loc) · 5.11 KB
/
EnumerableExtensions.cs
File metadata and controls
137 lines (121 loc) · 5.11 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
using AzureTableBrowser.Helpers;
using Microsoft.WindowsAzure.Storage.Table;
using System;
using System.Collections.Generic;
using System.Data;
using System.Dynamic;
using System.Linq;
namespace AzureTableBrowser.Extensions
{
/// <summary>
/// All extensions for Enumerables
/// </summary>
public static class EnumerableExtensions
{
/// <summary>
/// Returns enumerable as a hashset
/// </summary>
public static HashSet<T> ToHashSet<T>(this IEnumerable<T> source)
{
return new HashSet<T>(source);
}
/// <summary>
/// Returns true if an enumerable is empty
/// </summary>
public static bool IsEmpty<T>(this IEnumerable<T> enumerable)
{
return enumerable.IsNull() || !enumerable.Any();
}
/// <summary>
/// Converts an IEnumerable<dynamic> to DataTable
/// </summary>
public static DataTable ToDataTable(this IEnumerable<dynamic> list)
{
var result = new DataTable { TableName = "tableData" };
//enumerate greedyly to avoid multiple enumerations
var enumeratedData = list.ToList();
if (enumeratedData.IsEmpty())
return result;
var dictionary = (IDictionary<string, object>)enumeratedData[0];
if (dictionary != null)
{
var columnNames = dictionary.Keys.Distinct();
result.Columns.AddRange(columnNames.Select(c => new DataColumn(c)).ToArray());
}
else
{
return result;
}
foreach (dynamic dataItem in enumeratedData)
{
var item = (IDictionary<string, object>)dataItem;
var row = result.NewRow();
foreach (var key in item.Keys)
{
row[key] = item[key];
}
result.Rows.Add(row);
}
return result;
}
/// <summary>
/// Goes through <see cref="DynamicTableEntity"/> pickes up each property and its value, converts it to an ExpandoObject
/// </summary>
public static List<dynamic> ToDynamicList(this IEnumerable<DynamicTableEntity> dynamicTableEntities)
{
var list = new List<dynamic>();
var entityProperties = new HashSet<string>();
//iterate over all rows to collect all properties
foreach (var key in dynamicTableEntities.SelectMany(dynamicTableEntity => dynamicTableEntity.Properties.Keys))
{
entityProperties.Add(key);
}
foreach (var dynamicTableEntity in dynamicTableEntities)
{
var dynamicObject = new ExpandoObject() as IDictionary<string, Object>;
dynamicObject.Add(Constants.PartitionKey, (dynamic)dynamicTableEntity.PartitionKey);
dynamicObject.Add(Constants.RowKey, (dynamic)dynamicTableEntity.RowKey);
dynamicObject.Add(Constants.ETag, (dynamic)dynamicTableEntity.ETag);
dynamicObject.Add(Constants.Timestamp, (dynamic)dynamicTableEntity.Timestamp);
foreach (var entityProperty in entityProperties)
{
if (!dynamicTableEntity.Properties.ContainsKey(entityProperty))
{
dynamicObject.Add(entityProperty, (dynamic)string.Empty);
continue;
}
var item = dynamicTableEntity.Properties[entityProperty];
switch (item.PropertyType)
{
case EdmType.Binary:
dynamicObject.Add(entityProperty, (dynamic)item.BinaryValue);
break;
case EdmType.Boolean:
dynamicObject.Add(entityProperty, (dynamic)item.BooleanValue);
break;
case EdmType.DateTime:
dynamicObject.Add(entityProperty, (dynamic)item.DateTimeOffsetValue);
break;
case EdmType.Double:
dynamicObject.Add(entityProperty, (dynamic)item.DoubleValue);
break;
case EdmType.Guid:
dynamicObject.Add(entityProperty, (dynamic)item.GuidValue);
break;
case EdmType.Int32:
dynamicObject.Add(entityProperty, (dynamic)item.Int32Value);
break;
case EdmType.Int64:
dynamicObject.Add(entityProperty, (dynamic)item.Int64Value);
break;
case EdmType.String:
dynamicObject.Add(entityProperty, (dynamic)item.StringValue);
break;
}
}
list.Add(dynamicObject);
}
return list;
}
}
}