Linq:如何从对象数据中使用索引进行分组

本文关键字:索引 数据 对象 Linq | 更新日期: 2023-09-27 18:24:13

我有一个示例数据

---------------------------------------
   Name    |  Old  |  Year  |  Address
---------------------------------------
1. Ann     |  24   |  1990  |  Address1
---------------------------------------
2. Billy   |  22   |  1992  |  Address2
---------------------------------------
3. Chris   |  24   |  1990  |  Address3
---------------------------------------
4. Dean    |  23   |  1991  |  Address4
---------------------------------------

数据将显示在网格上,类似于标题列:名称、年份、地址

数据的类型为:IList。每个项目都有类型:object[]

如果我将Name分组,它将变为:

---------------------------------------
   Name    |  Old  |  Year  |  Address
---------------------------------------
1. Ann     |  24   |  1990  |  Address1
---------------------------------------
2. Billy   |  22   |  1992  |  Address2
---------------------------------------
3. Chris   |  24   |  1990  |  Address3
---------------------------------------
4. Dean    |  23   |  1991  |  Address4
---------------------------------------

如果我按年份分组,它会变成:

------------------------------------------------------
   Name         |  Old  |  Year  |  Address
------------------------------------------------------
1. Ann, Chris   |  24   |  1990  |  Address1, Address3
------------------------------------------------------
2. Billy        |  22   |  1992  |  Address2
------------------------------------------------------
3. Dean         |  23   |  1991  |  Address4
------------------------------------------------------

所以目前支持LINQ的团体,不能这么做。我的方法是:先按年份分组,然后手动操作中的数据。我有一个用户想要分组的列表索引:IList,在这种情况下是2。

因为我的数据有IList,每个数据都是object[],所以我写了一个类:

        class GroupComparer : IEqualityComparer<object>
        {
            private IList<int> indexList;
            public GroupComparer(IList<int> indexList)
            {
                this.indexList = indexList;    
            }
            #region IEqualityComparer<object> Members
            public bool Equals(object x, object y)
            {
                object[] arrX = (object[])x;
                object[] arrY = (object[])y;
                bool isEqual = true;
                foreach (var item in this.indexList)
                {
                    if(arrX[item] != arrY[item])
                    {
                        isEqual = false;
                    }
                }
                return isEqual;
            }
            public int GetHashCode(object obj)
            {
                int hCode = 0;
                object[] arrObj = (object[])obj;
                foreach (var item in this.indexList)
                {
                    hCode ^= (int)arrObj[item];
                }
                return hCode.GetHashCode();
            }
            #endregion
        }

这个地方消耗了它:

    IList<object> data = ConvertToArrayObject(strDatas);
    IList<int> index = new List<int>();
    index.Add(2);
    var groups = data.GroupBy(p => p, new GroupComparer(index));

但结果不是集体。

你能告诉我如何像那样按索引分组吗?

最佳考虑

Linq:如何从对象数据中使用索引进行分组

我通过文章回答了这个问题:当LINQ执行查询时