代码之家  ›  专栏  ›  技术社区  ›  Ksempac

在条件下用LINQ连接对象

  •  0
  • Ksempac  · 技术社区  · 15 年前

    我对Linq不熟悉,我在写一个要自学Linq的问题时遇到了麻烦。

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

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

    我的意思是,假设我有一个MyError对象列表,比如这个:

    • myError1:错误代码=错误类型1数组列表:A,C
    • myError2:错误代码=错误类型2数组列表:b、d、e
    • myError3:错误代码=错误类型2数组列表:f
    • myError4:错误代码=错误类型1数组列表:g
    • myError5:错误代码=错误类型3数组列表:z

    我想要的输出是包含以下对象的myError对象列表:

    • myError1:错误代码=错误类型1数组列表:A、C、G
    • myError2:错误代码=错误类型2数组列表:b、d、e、f
    • myError3:错误代码=错误类型3数组列表:Z

    LINQ有可能吗?如果是这样,怎么办?

    我猜想使用arraylist而不是myError类中的列表可能是一个问题,因此如果不能用arraylist完成,我想看到一个查询,它可以与使用列表的已修改myError类一起使用。

    提前谢谢

    2 回复  |  直到 12 年前
        1
  •  2
  •   jeroenh    15 年前
        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属性。

    使用强类型列表而不是数组列表总是一个好主意…

        2
  •  1
  •   Jan Jongboom    15 年前

    比如,在哪里 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()) };