+ 1

C# - search for better ways for char[] to int[] convert.

I'm someone who always want to use less code but I never come around using much by char[] to int[] convert. Any other methodes than my? Here some codes where I had that problem. https://code.sololearn.com/c1W5WyeKwY6J/?ref=app https://code.sololearn.com/cxs6i7xhpF8D/?ref=app P.s. : The Kaprekar's constant code should be more readable now cleaned a bit.

8th Jul 2022, 2:08 AM
Felix Alcor
Felix Alcor - avatar
20 Respuestas
+ 2
You could also use linq Select: list.Select(x => int.Parse(x)) It returns an IEnumerable<int> But be aware of exceptions if the string can't be parsed. edit: If you want to use char collections you need to convert them to strings when passing them to Parse: list.Select(x => int.Parse(x.ToString()))
8th Jul 2022, 4:12 PM
Alex
Alex - avatar
8th Jul 2022, 9:13 AM
Ipang
+ 1
Ipang I already tho of using it but I don't rly get it before I use them I still need to read a bit. But still thanks for the answer.
8th Jul 2022, 2:16 PM
Felix Alcor
Felix Alcor - avatar
+ 1
Here is an example for the ternary approach you asked for. If you don't want to use another number as fallback value you could use a nullable int: https://code.sololearn.com/cEY5EBL54fRQ/?ref=app
8th Jul 2022, 4:57 PM
Alex
Alex - avatar
+ 1
Option A: Create a custom comparer public class SampleComp : IComparer<int?> { public int Compare(int? a, int? b) { // compare logic // return 0 => equal -1 => lower 1 => higher } } Option B: (b ?? int.MinValue).CompareTo(a ?? int.MinValue)) (this is getting a bit out of hands with so many edge cases 😂) edit: also keep in mind, that sort takes care of null values. They get sorted before all other elements. And reverse also reverses them correctly. If you somehow get null values and don't want them you can also just filter the list and get rid of them -> list.Where(x => x != null)
8th Jul 2022, 6:25 PM
Alex
Alex - avatar
+ 1
Alex Thanks I would still Most likely take Option B by smaller Codes. And for 0-case I want to redo my Kraprekar's constant code so I still need them but still good to know. edit: When I want to delete all zeros I rather go with List.RemoveAll(x => x.Equals(0))
8th Jul 2022, 6:40 PM
Felix Alcor
Felix Alcor - avatar
+ 1
Then you'll get an exception if a value is null. If you are sure that the input is a digit you can use Parse instead of TryParse. Or you use try-catch for the input part. List<int> constant; try { constant = Console.ReadLine() .ToCharArray() .Select(x => int.Parse(x.ToString())) .ToList(); } catch(Exception ex) { Console.WriteLine(ex.Message); Console.WriteLine("Digits only!"); return; }
8th Jul 2022, 11:03 PM
Alex
Alex - avatar
0
Thanks both of you. I will try all the named methodes in my next codes. Note: I'm a bit slow with the courses so I didn't come much around Error Handling with as example Try{ } catch { }.
8th Jul 2022, 4:17 PM
Felix Alcor
Felix Alcor - avatar
0
There is also a TryParse, but it doesn't return the parsed value, but a bool as indicator if the parse was successful. var str = "100"; if(int.TryParse(str, out int number)) { // parse was successfull } else { // parse failed }
8th Jul 2022, 4:26 PM
Alex
Alex - avatar
0
Also could I just do as example var Input = "1000"; var str = int.TryParse(input, out int number) ? number : 0; ?
8th Jul 2022, 4:32 PM
Felix Alcor
Felix Alcor - avatar
0
Alex Thanks for the edit remark at the end, I tested it before and just used Convert.ToInt32() -48. Thanks for that I rather use that methode.
8th Jul 2022, 4:53 PM
Felix Alcor
Felix Alcor - avatar
0
Alex Good Code tho I understand some parts with the '?' (multiply). But I now Made my own Code with that Methode. https://code.sololearn.com/cCL1nV1W9hPG/?ref=app Question: Why does a <int?> List have no compare methode?
8th Jul 2022, 5:38 PM
Felix Alcor
Felix Alcor - avatar
0
I don't get the question, sorry. Could you explain what you mean?
8th Jul 2022, 5:53 PM
Alex
Alex - avatar
0
The List I needed to make isn't int but int? else I couldn't use the TryParse Methode like that. And int? seems to have no CompareTo Methode like int. I tried using List.Sort((a, b) => b.CompareTo(a)); but didn't work
8th Jul 2022, 6:06 PM
Felix Alcor
Felix Alcor - avatar
0
Alex tho I need to say that I rather would like to know about another desending Sort other than that. Note: I mean Methode except List.Reverse() and self Made sort
8th Jul 2022, 6:10 PM
Felix Alcor
Felix Alcor - avatar
0
I wrote that Code now with the desending Methode https://code.sololearn.com/cCL1nV1W9hPG/?ref=app
8th Jul 2022, 8:13 PM
Felix Alcor
Felix Alcor - avatar
0
Edit: We can avoid all that Edge cases we can write. (a, b) => b.Value.CompareTo(a.Value) Here in a Code again. https://code.sololearn.com/c146OxMj7R2s/?ref=app
8th Jul 2022, 9:52 PM
Felix Alcor
Felix Alcor - avatar
0
I now made it so because I want to Break it after writing it wrong one time: if(constant.Contains(null)) Console.WriteLine("Your input don't just contain digits"); else { constant.Sort((a,b) => b.Value.CompareTo(a.Value)); constant.ForEach(x => Console.Write(x.ToString())); } I rather Bond to familiar methodes so I always prefer using if-else or when I want to let the program take input until it's correct I would use while() edit: a.HasValue have the same effect as int.MinValue() and also don't need Error Handling
8th Jul 2022, 11:20 PM
Felix Alcor
Felix Alcor - avatar
0
Try Int32.Parse(Convert.ToString(char[i]))
10th Jul 2022, 1:32 AM
Leonid Amvrosov
Leonid Amvrosov - avatar
0
Leonid Amvrosov I tried to find a better way that to use always for-loops. Your Methode: for (int i = 0; i> charArr.Length; i++) List.Add(int.Parse(char[i].ToString()));
10th Jul 2022, 1:58 AM
Felix Alcor
Felix Alcor - avatar