我有一个类保存数据如下:
public class MyData
{
string Name {get;set;}
}
我有List<List<MyData>>()
作为结果集。现在我想根据它们的Name
属性对齐这些列表,并使用null
值作为填充。例如:
{{"A", "B", "C"}, {"B","D"}}
将
{
{"A", "B", "C"},
{null, "B","D"}
}
对于对齐数字列表也有类似的问题,但不确定如何在这种情况下应用它们。有什么办法吗?
编辑:我需要在对齐时向右移动;中间不能有空
但是列表的长度不一定相同
你可以先得到列表的最大长度:
var max_size = list.Max(x => x.Count);
然后在每个内部列表之前添加适当数量的空。max_size
将被用来计算这样的数字:
var result = list
.Select(x =>
Enumerable.Range(0, max_size - x.Count)
.Select(y => new MyData()) //Should this be (MyData)null?
.Concat(x)
.ToList())
.ToList();
请注意,我假设new MyData()
会给你一个对象,其name
属性是null
。
请注意,这不会修改原始列表,而是创建一个正确对齐的新列表。
这是一个扩展方法,通过属性存储一个枚举的枚举。
public static T[][] Bucket<T, TOrig>(this IEnumerable<IEnumerable<TOrig>> self, Func<TOrig, T> selector)
{
List<T> allValues = self.SelectMany(t => t).Select(selector).Distinct().ToList();
List<T[]> ret = new List<T[]>();
foreach (ICollection<TOrig> col in self)
{
T[] append = new T[allValues.Count];
foreach (TOrig orig in col)
{
T val = selector(orig);
append[allValues.IndexOf(val)] = val;
}
}
return ret.ToArray();
}
注意:输出是一个数组的数组,因为这比List<T>
更有意义。如果您真的需要列表,请随时致电ToList()
。
:
List<List<MyData>> yourListOfLists;
string[][] bucketed = yourListOfLists.Bucket(m => m.Name);