在条件下使用LINQ连接对象

时间:2009-12-24 13:24:39

标签: c# linq

我是LINQ的新手,我在编写一个查询时遇到麻烦,我正在写自己的LINQ。

我有一个MyError对象列表。 MyError对象具有错误代码(枚举)和MyEntryError对象的arraylist。某些MyError可能具有相同的错误代码。

我想创建一个LINQ查询,将MyError列表作为输入,并输出一个新的MyError列表,这样,对于每个错误代码,只有一个MyError将包含失败的所有MyEntryError,错误代码为MyError。

我的意思是说我有一个MyError对象列表,例如:

  • MyError1:errorcode = ErrorType1 Arraylist:A,C
  • MyError2:errorcode = ErrorType2 ArrayList:B,D,E
  • MyError3:errorcode = ErrorType2 ArrayList:F
  • MyError4:errorcode = ErrorType1 ArrayList:G
  • MyError5:errorcode = ErrorType3 ArrayList:Z

我想要的输出是具有以下对象的MyError对象列表:

  • MyError1:errorcode = ErrorType1 ArrayList:A,C,G
  • MyError2:errorcode = ErrorType2 ArrayList:B,D,E,F
  • MyError3:errorcode = ErrorType3 ArrayList:Z

LINQ可以吗?如果是这样,怎么样?

我猜测在MyError类中使用ArrayList而不是List可能是一个问题所以如果无法使用ArrayList,我希望看到一个可以使用修改后的MyError类的查询使用List

提前致谢

2 个答案:

答案 0 :(得分:2)

    public List<MyError> GroupErrorsByErrorCode(List<MyError> errors)
    {
        var result = errors.GroupBy(e => e.ErrorCode).Select(group => new MyError
            {
                ErrorCode = group.Key,
                // EDIT: was 
                // Errors = group.SelectMany(g => g.Errors)
                Errors = new ArrayList(group
                           .SelectMany(g => g.Errors.Cast<MyEntryError>())
                           .ToList())
            });
        return result;
    }

编辑:由于ArrayList有一个带ICollection的构造函数,您可以使用该重载来实例化Errors属性。

使用强类型列表而不是ArrayList总是一个好主意......

答案 1 :(得分:1)

之类的,其中errorList是MyError1 t / m MyError5的列表,而你的arraylist称为errors

from err in errorList
group err by err.errorcode into g
select new MyError { errorcode = g.Key, errors = new ArrayList(g.SelectMany(a => a.errors.Cast<YourType>()).ToArray()) };