如何根据对象的字符串属性对齐对象列表



我有一个类保存数据如下:

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);

相关内容

  • 没有找到相关文章

最新更新