我有一个用于保存数据的类,如下所示:
public class MyData
{
string Name {get;set;}
}
我有List<List<MyData>>()
作为结果集。现在,我想根据Name
属性对齐这些列表,并使用null
值作为填充。例如:
{{"A", "B", "C"}, {"B","D"}}
将
{
{"A", "B", "C"},
{null, "B","D"}
}
对于对齐数字列表存在类似的问题,但在这种情况下不确定如何应用它们。我有什么想法可以解决这个问题吗?
修改
我需要在对齐时向右移动;中间没有空值。
但是列表不必长度相同
答案 0 :(得分:2)
您可以先获取列表的最大长度:
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
的对象。
请注意,这不会修改原始列表,而是创建一个具有正确对齐方式的新列表。
答案 1 :(得分:0)
这是一个扩展方法,用于通过属性来存储枚举的枚举。
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();
}
注意:输出是一个数组数组,因为这对于bucketing而言比List<T>
更有意义。如果确实需要列表,请随时致电ToList()
。
对你:
List<List<MyData>> yourListOfLists;
string[][] bucketed = yourListOfLists.Bucket(m => m.Name);