FeatureClass获取唯一记录

版权声明: https://blog.csdn.net/qq_33459369/article/details/88767755

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

1、常规方式

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

/// <summary>
/// 得到要素类某字段的唯一值
/// </summary>
/// <param name="FClass">要素类</param>
/// <param name="strFld">指定要得到唯一值的字段</param>
public List<string> GetUniqueValue(IFeatureClass FClass,string strFld)
{
    List<string> plist = new List<string>();
    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;
}

2、使用枚举

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

/// <summary>
/// 得到要素类某字段的唯一值
/// </summary>
/// <param name="pFeatureClass">要素类</param>
/// <param name="strFld">指定要得到唯一值的字段</param>
/// <returns>唯一值字符数据</returns>
public static List<string> GetUniqueValueWithEnum(IFeatureClass pFeatureClass, string strFld)
{
    //定义List泛型           
    List<string> plist = new List<string>();
    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:不支持

/// <summary>
/// 得到要素类唯一记录
/// </summary>
/// <param name="FClass"></param>
/// <param name="strFld">字段名(可以多个字段,以逗号相隔,例如:"DLBM,DLMC")</param>
/// <returns></returns>
public List<string> GetUniqueValueByQF(IFeatureClass FClass, string strFld)
{
    List<string> plist = new List<string>();
    Dictionary<string, string> dic = new Dictionary<string, string>();
    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();
            //if (!plist.Contains(value))
                plist.Add(value);
                    
        }
    }
    return plist;
}

猜你喜欢

转载自blog.csdn.net/qq_33459369/article/details/88767755