FeatureClass获取多字段唯一记录

     测试数据:20万记录的图层,30个字段

1、常规方式

   gdb:耗时2846ms  mdb:3293ms    shp:5769ms

/// 
/// 得到要素类某字段的唯一值
/// 
/// 要素类
/// 指定要得到唯一值的字段
public List GetUniqueValue(IFeatureClass FClass,string strFld)
{
    List plist = new List();
    using (ComReleaser comReleaser = new ComReleaser())
    {
        int idx = FClass.FindField(strFld);
        var value = "";
        IFeatureCursor cursor = FClass.Search(null, true);
        comReleaser.ManageLifetime(cursor);
        IFeature feature = null;
        while ((feature = cursor.NextFeature()) != null)
        {
            value = feature.Value[idx].ToString();
            if (!plist.Contains(value))
                plist.Add(value);
        }
    }
    return plist;
}

在获取多字段唯一值时比IQueryDef2接口慢了许多:

        /// 
        /// 获取要素类唯一值
        /// 
        /// 要素类
        /// 字段集合
        /// 筛选条件
        /// 
        public static List> GetUniqueValue(IFeatureClass pFeatureClass, List flds,IQueryFilter queryFilter, out int fcount)
        {
            fcount = 0;
            Dictionary fldidx = new Dictionary();
            flds.ForEach(x => fldidx.Add(x, pFeatureClass.FindField(x)));

            Dictionary dic = new Dictionary();
            List> lis = new List>();

            IFeatureCursor cursor = pFeatureClass.Search(queryFilter, true);
            IFeature feature = null;
            while ((feature = cursor.NextFeature()) != null)
            {
                fcount++;
                foreach (var it in fldidx)
                    dic[it.Key] = feature.Value[it.Value];
                if (!lis.Exists(x => x.SequenceEqual(dic)))
                    lis.Add(new Dictionary(dic));
            }
            System.Runtime.InteropServices.Marshal.ReleaseComObject(cursor);
            return lis;
        }

 

2、使用枚举

 gdb: 耗时4972ms  mdb:3987ms    shp:7700ms

/// 
/// 得到要素类某字段的唯一值
/// 
/// 要素类
/// 指定要得到唯一值的字段
/// 唯一值字符数据
public static List GetUniqueValueWithEnum(IFeatureClass pFeatureClass, string strFld)
{
    //定义List泛型           
    List plist = new List();
    using (ComReleaser comReleaser=new ComReleaser())
    {
        //得到IFeatureCursor游标
        IFeatureCursor pCursor = pFeatureClass.Search(null, false);
        comReleaser.ManageLifetime(comReleaser);
        //coClass对象实例生成
        IDataStatistics pData = new DataStatisticsClass();
        pData.Field = strFld;
        pData.Cursor = pCursor as ICursor;
        //枚举唯一值
        IEnumerator pEnumVar = pData.UniqueValues;
        //可记录总条数:int RecordCount=pData.UniqueValueCount;
        pEnumVar.Reset();
        while (pEnumVar.MoveNext())
        {
            plist.Add(pEnumVar.Current.ToString());
        }
    } 
    return plist;
}

3、使用IQueryDef2接口

  gdb:耗时4390ms    mdb:178ms   shp:不支持

/// 
/// 得到要素类唯一记录
/// 
/// 
/// 字段名(可以多个字段,以逗号相隔,例如:"DLBM,DLMC")
/// 
public List GetUniqueValueByQF(IFeatureClass FClass, string strFld)
{
    List plist = new List();
    Dictionary dic = new Dictionary();
    using (ComReleaser comReleaser = new ComReleaser())
    {
        IDataset dataset = FClass as IDataset;
        IFeatureWorkspace featureWorkspace = dataset.Workspace as IFeatureWorkspace;
        // Create the QueryDef.  
        IQueryDef2 queryDef2 = (IQueryDef2)featureWorkspace.CreateQueryDef();
        queryDef2.Tables = dataset.Name;
        queryDef2.SubFields = $"Distinct {strFld}";

        ICursor cursor = queryDef2.Evaluate2(true);
        comReleaser.ManageLifetime(cursor);
        int idx = 0;
        switch (dataset.Workspace.WorkspaceFactory.GetType().Name)
        {
            case "AccessWorkspaceFactoryClass":
                idx = cursor.FindField($"Distinct {strFld.Split(',')[0]}");  //在mdb中首个字段名会变为:$"Distinct XX"
                break;
            case "FileGDBWorkspaceFactoryClass":
                idx = cursor.FindField(strFld.Split(',')[0]);
                break;
        }
        var value = "";
        IRow row = null;
        while ((row = cursor.NextRow()) != null)
        {
            value = row.Value[idx].ToString();
            plist.Add(value);
                    
        }
    }
    return plist;
}

获取多字段唯一值:

        /// 
        /// 得到要素类唯一记录
        /// 
        /// 
        /// 字段集合
        /// 限制条件
        /// 
        public static List> GetUniqueValueByQF(IFeatureClass FClass, List flds,string strWhere="")
        {
            List> pdic = new List>();
            Dictionary fldidx = new Dictionary();
            string fls = string.Empty;
            for (int i = 0; i < flds.Count; i++)
            {
                fldidx[flds[i]] = i;
                fls += $",{flds[i]}";
            } 
            Dictionary dic = new Dictionary();
            using (ComReleaser comReleaser = new ComReleaser())
            {
                IDataset dataset = FClass as IDataset;
                IFeatureWorkspace featureWorkspace = dataset.Workspace as IFeatureWorkspace;
                // Create the QueryDef.  
                IQueryDef2 queryDef2 = (IQueryDef2)featureWorkspace.CreateQueryDef();
                queryDef2.Tables = dataset.Name;
                    
                queryDef2.SubFields = $"Distinct {fls.Substring(1)}";
                if (!string.IsNullOrEmpty(strWhere))
                    queryDef2.WhereClause = strWhere;

                ICursor cursor = queryDef2.Evaluate2(true);
                comReleaser.ManageLifetime(cursor);
                IRow row = null;
                while ((row = cursor.NextRow()) != null)
                {
                    foreach (var it in fldidx)
                        dic[it.Key] = row.Value[it.Value];
                    pdic.Add(new Dictionary(dic));
                }
            }
            return pdic;
        }

 

你可能感兴趣的:(ArcGIS,C#)