Return the longest word (or words) in a string
Why do you have more parenthesis than needed in this statement?


if (((words[j] &gt;= 'A' &amp;&amp; words[j] &lt;= 'Z') || (words[j] &gt;= 'a' &amp;&amp; words[j] &lt;= 'z')))



if ((words[j] &gt;= 'A' &amp;&amp; words[j] &lt;= 'Z') || (words[j] &gt;= 'a' &amp;&amp; words[j] &lt;= 'z'))


Similarly:


if (l == (s.Length - 1))



Should be written as:

if (l == s.Length - 1)


As well:


for (int n = (indexList[m] - maxLength); n &lt; indexList[m]; n++)



Should be:

for (int n = indexList[m] - maxLength; n &lt; indexList[m]; n++)




Using j, k and l as a variable in this manner is frowned upon. These should only ever be used with local iterators. (I.e. where you have i.)



Some of your names are not idiomatic.


char[] words = s.ToCharArray();



Should be:

char[] characters = s.ToCharArray();




The string s parameter should be string input (et. al.).



You can take some of your operations to functions, delegates, Lambdas, etc.


if (((words[l] &gt;= 'A' &amp;&amp; words[l] &lt;= 'Z') || (words[l] &gt;= 'a' &amp;&amp; words[l] &lt;= 'z')))



Can more easily be written as a delegate, function, etc.

if (IsAlphaChar(words[l])




Use a foreach loop in place of:


for (int m = 0; m &lt;= k - 1; m++)



Should be:

foreach (int index in indexList)


Then just use index in place of indexList[m].



Never do this:


int j = 0, k = 0, l = 0, tempLength = 0, maxLength = 0;



That is a readability nightmare. Break each variable to it's own line. (And don't declare all of them in one spot. Declare them when you need them.)



You shouldn't declare iterators outside a for loop. (I'm looking at you, j and l.)



Doing words[i] four times is slower than char currentCharacter = words[i];. (Of course, the location that is used should be a method instead.)



You don't use j or l after their respective loops, so don't define them as the first thing in the method. Instead, define them as:

for (int j = i; j &lt;= s.Length; j++)
for (int l = i; l &lt;= s.Length; l++)