0

In My ENUM a list of values is added and I need to check if certain string values are in my ENUM and which is dynamically checked through a loop.

public Enum KeyValues{CaseNumber, Name, OwnerId, Id}

Need to check if keyValues contains Name

If('Name' == keyvalues--)// how to check if 'Name' is in ENUM - KeyValues)
4
  • Also why are you using an Enum for this requirement? Looks like you are trying to represent SObjectField, which is a much more appropriate token type if that's what you are after. – Adrian Larson Mar 12 '18 at 15:29
  • yeah but I don't want certain fields (few fields) to be included and it varies from object to object, so specified those fields in Enum and excluding that fields – SFDC Mar 13 '18 at 7:14
  • Hence field set... – Adrian Larson Mar 13 '18 at 13:38
8

You can use the values method to get all values of enum, then check name of each in loop.

Set<String> enumNames = new Set<String>();
for (KeyValues keyValue : KeyValues.values()){
    enumNames.add(keyValue.name()); 
}

if(enumNames.contains('Name')){
    // do something
}
3
  • thanks @alexander :) some other way without using a loop is preferable because am gonna check if the enum contains a string inside a for loop, so it's not the best practice to use a loop inside a loop right ?? it has to loop through each and every time. Please tell me if there any other way to achieve this, thanks - If not Will stick with this method – SFDC Mar 12 '18 at 13:30
  • 1
    @dinesh if you have to perform checking multiple times, just collect values of enum in set. See my updated answer – Oleksandr Berehovskyi Mar 12 '18 at 13:35
  • Yeah mate :) got it thanks for the Updated answer and your time :) – SFDC Mar 13 '18 at 5:11
2

If you want to check whether or not a String value corresponds to a valid field name, you should use describes to get the field map. That way you don't have to maintain all the supported values, and you can support more than 100 fields. As a bonus, it's actually case-insensitive.

Map<String, SObjectField> fields = SObjectType.Case.fields.getMap();
system.debug(fields.containsKey('CaseNumber'));
system.debug(fields.containsKey('CASENUMBER'));
system.debug(fields.containsKey('casenumber'));
system.debug(fields.containsKey('CaSeNuMbEr'));

If you want to support just a subset of all fields, use a Field Set. This approach is case-sensitive unless you build in some additional logic.

Set<String> fields = new Set<String>();
for (FieldSetMember member : SObjectType.Case.fieldsets.MyFieldSet)
{
    fields.add(member.getFieldPath());
}
system.debug(fields.contains('CaseNumber');

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.