You can use Array.Find
to check whether item in array already exists:
private string[] Distinct(string[] sourceArray)
{
// Declare target array for unique values
string[] distinctedArray = new string[sourceArray.Length];
for (int i = 0; i < sourceArray.Length; i++)
{
// Try find element by default equality ==
if (Array.Find(distinctedArray, x => x == sourceArray[i]) is null)
{
// If no item was wound - then add it to result array
distinctedArray[i] = sourceArray[i];
}
}
// Remove empty elements by joining items into one string and splitting back to array
distinctedArray = string.Join("\n", distinctedArray)
.Split(new string[] { "\n" }, StringSplitOptions.RemoveEmptyEntries);
return distinctedArray;
}
Sample usage:
void Main(string[] args = default)
{
// Source array of 14 items
string[] source = new string[]
{
"pineapple",
"pear",
"citron",
"banana",
"pineapple",
"peach",
"peach",
"kiwi",
"mandarin",
"pineapple",
"cherry",
"pear",
"pear",
"citron"
};
string[] distinctedArray = Distinct(source);
// Result array of 8 items:
// "pineapple"
// "pear"
// "citron"
// "banana"
// "peach"
// "kiwi"
// "mandarin"
// "cherry"
}
Default equality comparer ==
may be replaced with string.Equals
method to be able to use StringComparison
enum. For example, if you want to care about duplicates like "pear"/"PeAr"/"pEAR", you can specify StringComparison.OrdinalIgnoreCase
(I also used .Trim()
and ?
null-checks):
private string[] Distinct(string[] sourceArray, StringComparison comparisonMode = StringComparison.Ordinal)
{
string[] distinctedArray = new string[sourceArray.Length];
for (int i = 0; i < sourceArray.Length; i++)
if (Array.Find(distinctedArray, x => string.Equals(x?.Trim(), sourceArray[i]?.Trim(), comparisonMode)) is null)
distinctedArray[i] = sourceArray[i];
return string.Join("\n", distinctedArray)
.Split(new string[] { "\n" }, StringSplitOptions.RemoveEmptyEntries);
}
Example:
void Main(string[] args = default)
{
string[] source = new string[]
{
"pear",
"Pear",
"pEAR",
"pEaR"
};
string[] distinctedArray1 = Distinct(source, StringComparison.OrdinalIgnoreCase);
// Result:
// "pear"
string[] distinctedArray2 = Distinct(source, StringComparison.Ordinal);
// Result:
// "pear"
// "Pear"
// "pEAR"
// "pEaR"
}