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

时间:2016-06-30 13:53:30

标签: c# algorithm linq list

我有一个用于保存数据的类,如下所示:

public class MyData
{
   string Name {get;set;}
}

我有List<List<MyData>>()作为结果集。现在,我想根据Name属性对齐这些列表,并使用null值作为填充。例如:

{{"A", "B", "C"}, {"B","D"}}

{
   {"A", "B", "C"}, 
   {null, "B","D"}
}

对于对齐数字列表存在类似的问题,但在这种情况下不确定如何应用它们。我有什么想法可以解决这个问题吗?

修改

我需要在对齐时向右移动;中间没有空值。

但是列表不必长度相同

2 个答案:

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