如何按IEnumerable属性中的值进行分组

时间:2011-08-17 17:08:59

标签: c# linq

我有一个看起来像这样的课程

public class TestCase
{
    public IEnumerable<string> Categories { get; private set; }
}

我有一个TestCase对象列表,我希望能够按类别进行分组,这样如果一个TestCase在类别中具有值“a”和“b”,那么该测试用例的实例将在“a”的分组和“b”的分组。我对Linq的GroupBy的理解让我相信它会使用IEnumerable的Equals方法,如果按类别分组,我会为每个测试用例得到一个完全不同的组。

我有一个强力解决方案,实现了我想要的分组

var categoryGroups = new Dictionary<string, List<TestCase>>();

foreach (var testCase in testPackage.TestCase)
{
    foreach (var category in testCase.Categories)
    {
        if (!categoryGroups.ContainsKey(category))
        {
            categoryGroups.Add(category, new List<TestCase>());
        }

        categoryGroups[category].Add(testCase);
    }
}

但这很难看。有没有更好的方法来获得我想要的分组?

2 个答案:

答案 0 :(得分:5)

如果您使用以下LINQ查询:

var result = from testCase in testCases
             from category in testCase.Categories
             group testCase by category into g
             select g;

对于像这样的一组TestCase对象:

TestCase "X": Categories "A", "B", "C"
TestCase "Y": Categories "C", "B", "D"

然后您将获得每个不同类别的TestCase对象,如下所示:

Category "A": TestCases "X"
Category "B": TestCases "X", "Y"
Category "C": TestCases "X", "Y"
Category "D": TestCases "Y"

答案 1 :(得分:3)

public class TestPackage
{
    public List<TestCase> testCase = new List<TestCase>();
}

public class TestCase
{
    public IEnumerable<string> Categories { get; private set; }
}

TestPackage testpackage = new TestPackage();
var result = testpackage.testCase.GroupBy(rs => rs.Categories);