Does anyone know why the string contains function always returns true
if the token is an empty string? I expected it to return false.

"AnyOldText".Contains("")
or
"AnyOldText".Contains(String.Empty)

Re: Confused about the String Contains function by Ignacio

Ignacio
Thu May 08 08:36:43 CDT 2008

On May 8, 9:29=A0am, SMJT <shanemjtowns...@hotmail.com> wrote:
> Does anyone know why the string contains function always returns true
> if the token is an empty string? =A0I expected it to return false.
>
> "AnyOldText".Contains("")
> or
> "AnyOldText".Contains(String.Empty)

why?


you would expect that (both whole and part are string)
(whole+part).Contains( part)
return true ALWAYS no?

Why the above would change if part=3D String.Empty;

Re: Confused about the String Contains function by Marc

Marc
Thu May 08 08:42:12 CDT 2008

That sounds reasonable to me, in the same way that I agree that
"AnyOldText".IndexOf("") == 0;

Not a real justification, but consider a string "abcdef"; it contains
"abcdef", and "abcde", and "abcd", and "abc", and "ab", and "a" - why
wouldn't it contain ""? We've simply reduced it to a substring...

Of course, you could just check the length of your strings before
calling Contains?

Marc

Re: Confused about the String Contains function by parez

parez
Thu May 08 08:51:54 CDT 2008

On May 8, 9:29 am, SMJT <shanemjtowns...@hotmail.com> wrote:
> Does anyone know why the string contains function always returns true
> if the token is an empty string? I expected it to return false.
>
> "AnyOldText".Contains("")
> or
> "AnyOldText".Contains(String.Empty)

"abc" + "" = "abc"

it means that "abc" contains ""

Re: Confused about the String Contains function by Chris

Chris
Thu May 08 14:34:10 CDT 2008

Seems like ("").Contains("") would be true.

"SMJT" <shanemjtownsend@hotmail.com> wrote in message
news:3dd17fb1-44de-4c76-a9c2-b9759ddf851f@d45g2000hsc.googlegroups.com...
> Does anyone know why the string contains function always returns true
> if the token is an empty string? I expected it to return false.
>
> "AnyOldText".Contains("")
> or
> "AnyOldText".Contains(String.Empty)
>



Re: Confused about the String Contains function by SMJT

SMJT
Fri May 09 03:14:18 CDT 2008

Thanks for all the replies and explanations.

>> (whole+part).Contains( part) return true ALWAYS no? ...
Fair enough, IF an empty string was part of the original string, but
if a string has any contents, how can any part of it be empty?

>>"AnyOldText".IndexOf("") == 0;
yes but so does "AnyOldText".IndexOf("A") so which is it position 0 an
empty string or a text stream?
And "AnyOldText".IndexOf("",1) == 1; "AnyOldText".IndexOf("",2) ==
2; "AnyOldText".IndexOf("",3) == 3; etc ... So by that logic there is
an empty string at each of these positions and text, which although
theoretically true isn't exactly useful information.

>>"abc" + "" = "abc", it means that "abc" contains ""
No it doesn't, it just means you concatenated nothing to the original
string so I would expect it to remain unchanged.

>>("").Contains("")
Yeah, ok that makes sense and I expected this to be the only time
Contains returned TRUE.

Anyway thank you all for your replies, it is much appreciated.

Re: Confused about the String Contains function by Peter

Peter
Fri May 09 12:57:36 CDT 2008

On Fri, 09 May 2008 01:14:18 -0700, SMJT <shanemjtownsend@hotmail.com> =

wrote:

> Thanks for all the replies and explanations.
>
>>> (whole+part).Contains( part) return true ALWAYS no? ...
> Fair enough, IF an empty string was part of the original string, but
> if a string has any contents, how can any part of it be empty?

But that's just it. Every zero-length substring of your original string=
=

is "empty". A string of length N has N zero-length substrings in it. O=
ne =

for each character position in the string of length N.

>>> "AnyOldText".IndexOf("") =3D=3D 0;
> yes but so does "AnyOldText".IndexOf("A") so which is it position 0 an=

> empty string or a text stream?

What do you mean by "text stream"?

In any case, for a string of length N, there are N+1 strings you can pas=
s =

to IndexOf() that will return 0. The fact that you can get =

"AnyOldText".IndexOf("A") to return 0 is no more a problem than that you=
=

can also get "AnyOldText".IndexOf("An"), "AnyOldText".IndexOf("Any"), et=
c. =

to return 0.

There's nothing wrong at all for allowing more than one string to return=
=

the same character index for the IndexOf() method, including the empty =

string "".

> And "AnyOldText".IndexOf("",1) =3D=3D 1; "AnyOldText".IndexOf("",2) =
=3D=3D
> 2; "AnyOldText".IndexOf("",3) =3D=3D 3; etc ... So by that logic ther=
e is
> an empty string at each of these positions and text, which although
> theoretically true isn't exactly useful information.

It's not just theoretically true. It's logically true. At every =

character position, there are a number of possible substrings that can b=
e =

found at that position. Including the zero-length substring "".

>>> "abc" + "" =3D "abc", it means that "abc" contains ""
> No it doesn't, it just means you concatenated nothing to the original
> string so I would expect it to remain unchanged.

I agree that example was a bit awkward. However, it's a specific exampl=
e =

of making the statement: "string A contains string B if and only if ther=
e =

exist strings A1 and A2 such that A1 + B + A2 =3D A". Since "" is a val=
id =

string, then for string "abc", we have as candidates for A1 the strings =
=

"", "a", "ab", and "abc", and as candidates for A2 the strings "abc", =

"bc", "c", and "", respectively.

>>> ("").Contains("")
> Yeah, ok that makes sense and I expected this to be the only time
> Contains returned TRUE.

It's clear you expected that. But your expectation wasn't correct, or =

even logical. The Contains() and IndexOf() methods would be logically =

inconsistent if they treated "" differently from any other string. So =

they don't. The empty string "" follows all of the same rules for =

Contains() and IndexOf() that other strings follow.

Pete

Re: Confused about the String Contains function by Ben

Ben
Fri May 09 12:59:23 CDT 2008

SMJT wrote:
> Thanks for all the replies and explanations.
>
>>> (whole+part).Contains( part) return true ALWAYS no? ...
> Fair enough, IF an empty string was part of the original string, but
> if a string has any contents, how can any part of it be empty?

Contains is true when any contiguous subset of the original string is the
sought string. Since a zero-length substring is not discontiguous, and is
equal to the sought string, clearly the condition for Contains is met.

>
>>> "AnyOldText".IndexOf("") == 0;
> yes but so does "AnyOldText".IndexOf("A") so which is it position 0 an
> empty string or a text stream?
> And "AnyOldText".IndexOf("",1) == 1; "AnyOldText".IndexOf("",2) ==
> 2; "AnyOldText".IndexOf("",3) == 3; etc ... So by that logic there is
> an empty string at each of these positions and text, which although
> theoretically true isn't exactly useful information.

If you wanted "useful" information, you would search for a non-empty string.

>
>>> "abc" + "" = "abc", it means that "abc" contains ""
> No it doesn't, it just means you concatenated nothing to the original
> string so I would expect it to remain unchanged.
>
>>> ("").Contains("")
> Yeah, ok that makes sense and I expected this to be the only time
> Contains returned TRUE.
>
> Anyway thank you all for your replies, it is much appreciated.



Re: Confused about the String Contains function by Jon

Jon
Fri May 09 16:02:46 CDT 2008

SMJT <shanemjtownsend@hotmail.com> wrote:
> Thanks for all the replies and explanations.
>
> >> (whole+part).Contains( part) return true ALWAYS no? ...
> Fair enough, IF an empty string was part of the original string, but
> if a string has any contents, how can any part of it be empty?

There exists an empty string beginning at every place in the string. I
can't think of any definition of containment for which that's not true.

> >>"AnyOldText".IndexOf("") == 0;
> yes but so does "AnyOldText".IndexOf("A") so which is it position 0 an
> empty string or a text stream?

Both, just as "An" is also at the start, and so is "Any".

> And "AnyOldText".IndexOf("",1) == 1; "AnyOldText".IndexOf("",2) ==
> 2; "AnyOldText".IndexOf("",3) == 3; etc ... So by that logic there is
> an empty string at each of these positions and text, which although
> theoretically true isn't exactly useful information.

Asking for the index of an empty string isn't a question which can
yield useful information though. Ask a silly question, get a silly
answer.

> >>"abc" + "" = "abc", it means that "abc" contains ""
> No it doesn't, it just means you concatenated nothing to the original
> string so I would expect it to remain unchanged.

The logic seems fairly clear to me: if x+y=z, then z contains y, right?
Now apply the same logic with x="abc", y="" and thus z="abc".

> >>("").Contains("")
> Yeah, ok that makes sense and I expected this to be the only time
> Contains returned TRUE.

Why?

--
Jon Skeet - <skeet@pobox.com>
Web site: http://www.pobox.com/~skeet
Blog: http://www.msmvps.com/jon.skeet
C# in Depth: http://csharpindepth.com