c# - 根据对象类型拆分对象列表

标签 c# .net linq extension-methods

我有以下对象列表 - "Text1"、"Text2"、new UndefinedInfo("Undfined1")、new UndefinedInfo("Undfined2")、new UndefinedInfo("Undefine3")、"Text3"

我需要如下输出:

输出 //列表> 0 – 文本 1、文本 2 1 – 未定义 1、未定义 2、未定义 3 2 – 文本3

我设法编写了下面的函数,虽然很糟糕,但工作正常。有什么方法可以使用 LINQ 扩展 - TakeWhile 或 SkipWhile 或使用 Yield 来实现相同的目的。非常感谢任何帮助:

public static List<List<object>> PartitionByTypes(List<object> values)
{
List<List<object>> partitionedList = new List<List<object>>();

        int j;
        for (int i = 0; i < values.Count; i++)
        {
            j = i;
            List<object> subList = new List<object>();
            Type t = values[j].GetType();
            do
            {
                subList.Add(values[j]);
                j++;
                if (j == values.Count)
                {
                    break;
                }
            } while (values[j].GetType() == t);
            partitionedList.Add(subList);
            i = j - 1;
        }

        return partitionedList;
    }

最佳答案

以下将使用 yield 执行您想要的操作。所以返回将是 IEnumerable<List<object>>相反。

public static IEnumerable<List<object>> PartitionByTypes(List<object> values)
{
    Type prevType = null;
    List<object> cache = new List<object>();
    foreach (var value in values)
    {
        if(prevType != null && value.GetType() != prevType)
        {
            yield return cache;
            cache = new List<object>();
        }

        cache.Add(value);
        prevType = value.GetType();
    }

    if(cache.Count > 0)
        yield return cache;
}

或者,您可以使用以下 Linq 查询

public static IEnumerable<List<object>> PartitionByTypes(List<object> values)
{
    int count = 0;
    return values.Select((o, i) => new 
        { 
            Object = o, 
            Group = (i == 0 || o.GetType() == values[i - 1].GetType()) ? count : ++count 
        })
        .GroupBy(x => x.Group)
        .Select(g => g.Select(x => x.Object).ToList());
}

关于c# - 根据对象类型拆分对象列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37573774/

相关文章:

c# - 使用 LINQ/JavaScriptSerializer 创建 JSON 对象而不是数组

c# - 包含的亚音速查询构造(Guid)

C# DateTime.Now 没有将正确的时间写入 MySql 数据库

c# - ContentDialog Windows 10 Mobile XAML - 全屏 - 填充

c# - 输入不是有效的 Base-64 字符串

c# - 将 for 循环更改为 Parallel.For 循环

.net - 在 CPU 寄存器中分配局部变量

c# - WIF 和子域

Linq 和 SubSonic - 返回嵌套的复杂类型

时间:: Utility to find circular references/compile in correct order?