Hi,
When using the following code to find a specific layer in my map, I am finding that if a similarly named layer exists first in the TOC, then the FeatureLayer object gets set to it.
FeatureLayer sanForceMainLayer = map.GetLayersAsFlattenedList().OfType<FeatureLayer>().Where(l => l.Name.IndexOf("GISWRKS1.WORKS.ForceMain", StringComparison.CurrentCultureIgnoreCase) >= 0).FirstOrDefault();
For example, if I have a TOC like this:
layer1
layer2
GISWRKS1.WORKS.ForceMain_removals
layer4
layer5
GISWRKS1.WORKS.ForceMain
layer7
In this case, sanForceMainLayer is getting set to 'GISWRKS1.WORKS.ForceMain_removals'. I am expecting it to match exactly to 'GISWRKS1.WORKS.ForceMain'.
Thanks,
Solved! Go to Solution.
Brian, just change your test from "IndexOf" to "==" or string.Compare. Currently, you are testing for any layer that contains the string "GISWRKS1.WORKS.ForceMain" which is not what you want.
p.s. As an alternative, you can also include lambdas in most all LINQ extensions if you want to make your statements more concise...[for example Where(x => x == 1).FirstOrDefault() versus FirstOrDefault(x => x == 1)]
Brian, just change your test from "IndexOf" to "==" or string.Compare. Currently, you are testing for any layer that contains the string "GISWRKS1.WORKS.ForceMain" which is not what you want.
p.s. As an alternative, you can also include lambdas in most all LINQ extensions if you want to make your statements more concise...[for example Where(x => x == 1).FirstOrDefault() versus FirstOrDefault(x => x == 1)]
Hey Brian,
Working as intended?
IndexOf for strings reports the occurrence of string in the current string object.
If you had said IndexOf("a") it would have returned Layer1 for example.
You need to check if one string equals another so you could use either:
var lyr = MapView.Active.Map.GetLayersAsFlattenedList().Where(l => l.Name.ToLower() == "streams").FirstOrDefault();
var lyr2 = MapView.Active.Map.FindLayers("streams").FirstOrDefault();
Include .OfType<FeatureLayer> as needed.
You asked a related question last year: Does a certain layer exist in map
Sean
Thanks Charles Macleod and Sean Jones
As I'm really just a part-time coder I had no idea that this was connected to LINQ, so I wasn't really sure where to start looking for answers. I will definitely investigate LINQ now that I know.
I've really just been using the method Sean talks about when he mentions my 'related question', but now that I know how to structure the command and what the l => l == l is all about, I can definitely make some changes to how I do things.
This is what I ended up with in the end:
FeatureLayer sanForceMainLayer = map.GetLayersAsFlattenedList().OfType<FeatureLayer>().Where(l => l.Name == "GISWRKS1.WORKS.ForceMain").FirstOrDefault();
Thanks!!