如何根据事件对列表进行分组?

时间:2015-10-05 11:51:50

标签: c# linq list

我有一个List<Class>,里面有15个对象。 数据由Strings组成,如下所示:

情景
物品1
ITEM2
项目3
简介
物品1
ITEM2
简介
项目
简介
物品1
item2

我想要做的是根据配置文件的出现次数对数据进行分组。我想将包含所有配置文件的新列表与其项目分组,或者使用LINQ对它们进行分组?我需要的结果如下:

new List<Class> List1  
    Profiles  
    item1  
    item2  
    item3


new List<Class> List2  
    Profiles  
    item1  
    item2  

个人资料和项目的出现可能会有所不同,任何人都知道如何做到这一点? 希望我很清楚。

这是将List传递给方法的代码的一部分,需要根据事件将其分组到不同的配置文件中:

    private GroupProfiles(List<ProfileItems> allProfiles)  
    {  
           // Do something with allProfiles.
    } 

2 个答案:

答案 0 :(得分:1)

您可以编写一种方法将原始列表拆分为离散列表,如下所示:

// 'TargetSelector' is a delegate that you use to specify how to get from the class instances
// the string by which you want to group the items.

private static IEnumerable<List<T>> splitBy<T>(string target, List<T> data, Func<T, string> targetSelector)
{
    var group = new List<T>();

    foreach (T item in data)
    {
        if (targetSelector(item) == target)
        {
            if (group.Count > 0)
            {
                yield return group;
                group = new List<T>();
            }
        }

        group.Add(item);
    }

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

这是一个可编辑的例子:

using System;
using System.Collections.Generic;
using System.Linq;

namespace Demo
{
    class MyClass
    {
        public MyClass(string myString)
        {
            MyString = myString;
        }

        public string MyString { get; private set; }
    }

    internal class Program
    {
        private static void Main()
        {
            var strings = new[]
            {
                "Profiles",
                "item1",
                "item2",
                "item3",
                "Profiles",
                "item1",
                "item2",
                "Profiles",
                "item",
                "Profiles",
                "item1",
                "item2"
            };

            // Make a list of "MyClass" items to demonstrate the use of 'splitBy()'.

            var items = strings.Select(str => new MyClass(str)).ToList();

            var profiles = splitBy("Profiles", items, item=>item.MyString).ToList();

            // Now profiles is a list of items separated into profiles. Print them.

            for (int i = 0; i < profiles.Count; ++i)
            {
                Console.WriteLine("Profile " + i);

                for (int j = 0; j < profiles[i].Count; ++j)
                    Console.WriteLine("  " + profiles[i][j].MyString);

                Console.WriteLine();
            }
        }

        // 'TargetSelector' is a delegate that you use to specify how to get from the class instances
        // the string by which you want to group the items.

        private static IEnumerable<List<T>> splitBy<T>(string target, List<T> data, Func<T, string> targetSelector)
        {
            var group = new List<T>();

            foreach (T item in data)
            {
                if (targetSelector(item) == target)
                {
                    if (group.Count > 0)
                    {
                        yield return group;
                        group = new List<T>();
                    }
                }

                group.Add(item);
            }

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

该程序的输出是:

Profile 0
  Profiles
  item1
  item2
  item3

Profile 1
  Profiles
  item1
  item2

Profile 2
  Profiles
  item

Profile 3
  Profiles
  item1
  item2

答案 1 :(得分:0)

可能的解决方案:

  1. 使用list-property
  2. 创建一个新类
  3. 创建该类的列表
  4. 遍历您的列表
  5. 每次点击&#34;个人资料&#34;创建一个新的类实例并将以下项添加到新类中,直到您点击&#34; Profiles&#34;试。
  6. 希望你明白我要解释的内容。 它可能不是最好的方式,但它应该有效。