我有一个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.
}
答案 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)
可能的解决方案:
希望你明白我要解释的内容。 它可能不是最好的方式,但它应该有效。