[英]C# Distinct Comma-separated values not working
我試圖從逗號分隔的字符串中刪除重復的值,並且結果不一致。 例如,
如果我通過:
STA27,STA27,STA27B,STA27A,STA27B,
我得到:
STA27,STA27,STA27B,STA27A,
或者,如果我通過:
STA24,STA24,STA24,STA24,
我得到:
STA24,STA24,
我嘗試了幾種方法來消除逗號,但似乎沒有任何效果。 我不明白為什么Distinct也不起作用。 我認為這與字符串終止的方式有關,但是在第一個示例中,我得到了前兩個條目的重復,因此這似乎不是位置問題。
有什么想法嗎?
public string FindDistinctBeats(String Beats)
// Accept comma-separated string, return distinct values
{
string result = string.Empty;
try
{
result = string.Join(",", Beats.Split(',').Distinct().ToArray());
result = result.TrimEnd(',');
if (String.IsNullOrEmpty(result))
{
return result;
}
else
{
return result.TrimEnd(result[result.Length - 1]);
}
}
catch (Exception e)
{
return e.ToString();
}
}
一個簡單的測試顯示了預期的結果:
public class Distinct
{
private string input = "STA27,STA27,STA27B,STA27A,STA27B,";
[Test]
public void DistinctTest()
{
var distincts = input.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries).Distinct();
foreach(var entry in distincts)
{
Console.WriteLine(entry);
}
}
}
輸出量
STA27
STA27B
STA27A
如前所述,您缺少StringSplitOptions.RemoveEmptyEntries選項。 另外,考慮在拆分之前清理字符串,如下所示:
// test string with some whitespace and a control char in the end of the string
string beats = "STA27,STA27,STA27B,STA27A,STA27B, " + '\u0002';
beats = string.Join(string.Empty, beats.ToCharArray().Where(x => !Char.IsControl(x) && !Char.IsWhiteSpace(x)));
List<string> distinctBeats = beats.Split(",", StringSplitOptions.RemoveEmptyEntries)
.Distinct()
.ToList();
並且如果您需要區分大小寫的區分符,則可以使用StringComparer(在這種情況下為StringComparer.InvariantCultureIgnoreCase ):
List<string> distinctBeats = beats.Split(",", StringSplitOptions.RemoveEmptyEntries)
.Distinct(StringComparer.InvariantCultureIgnoreCase)
.ToList();
許多答案都有正確的指導,但我想指出,原始代碼有2個問題。 但是,上面提供的輸入運行的上述代碼不會返回您指定的輸出。 我在下面創建了一個提琴手來說明這一點。
一個是return result.TrimEnd(result[result.Length - 1]);
從而消除了結果的最后一個字符。 刪除了if
語句后,代碼可以正常工作。
另一個是結尾逗號。 在處理顯式刪除尾隨逗號的過程中,還可以使用StringSplitOptions.RemoveEmptyEntries
。 尾隨空格導致string.Empty是拆分中的最后一個結果。
using System;
using System.Linq;
public class Program
{
public static void Main()
{
Console.WriteLine("Original:");
Console.WriteLine(OriginalFindDistinctBeats("STA24,STA24,STA24,STA24,"));
Console.WriteLine(OriginalFindDistinctBeats("STA27,STA27,STA27B,STA27A,STA27B,"));
Console.WriteLine();
Console.WriteLine("New working (removed that weird if statement):");
Console.WriteLine(NewFindDistinctBeats("STA24,STA24,STA24,STA24,"));
Console.WriteLine(NewFindDistinctBeats("STA27,STA27,STA27B,STA27A,STA27B,"));
Console.WriteLine();
Console.WriteLine("New working with remove empty:");
Console.WriteLine(NewWithRemoveEmptyFindDistinctBeats("STA24,STA24,STA24,STA24,"));
Console.WriteLine(NewWithRemoveEmptyFindDistinctBeats("STA27,STA27,STA27B,STA27A,STA27B,"));
}
public static string OriginalFindDistinctBeats(String Beats)
// Accept comma-separated string, return distinct values
{
string result = string.Empty;
try
{
result = string.Join(",", Beats.Split(',').Distinct().ToArray());
result = result.TrimEnd(',');
if (String.IsNullOrEmpty(result))
{
return result;
}
else
{
return result.TrimEnd(result[result.Length - 1]);
}
}
catch (Exception e)
{
return e.ToString();
}
}
public static string NewFindDistinctBeats(String Beats)
// Accept comma-separated string, return distinct values
{
string result = string.Empty;
try
{
result = string.Join(",", Beats.Split(',').Distinct().ToArray());
result = result.TrimEnd(',');
return result;
}
catch (Exception e)
{
return e.ToString();
}
}
public static string NewWithRemoveEmptyFindDistinctBeats(String Beats)
// Accept comma-separated string, return distinct values
{
string result = string.Empty;
try
{
result = string.Join(",", Beats.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries).Distinct().ToArray());
return result;
}
catch (Exception e)
{
return e.ToString();
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.