我可能做錯了什么,但我正在嘗試在 Codewars 上做這個 Kata
這是我當前的代碼如下。
public static class Kata
{
public static IEnumerable<T> UniqueInOrder<T>(IEnumerable<T> arr)
{
Type t = typeof(T);
if (t == typeof(string))
return (IEnumerable<T>)String.Join("",arr.Distinct()).AsEnumerable();
return arr.Distinct().ToArray();
}
}
此 kata 的單元測驗期望將“AAAABBBCCDAABBB”的輸入作為“ABCDAB”回傳。
由于此錯誤,我上面的代碼失敗
Expected is <System.String>, actual is <System.Char[6]>
如果我嘗試回傳一個字串,我會收到此錯誤: error CS0029: Cannot implicitly convert type 'string' to 'System.Collections.Generic.IEnumerable<T>'
如果我無法回傳字串(并且字符陣列失敗),我將如何回傳預期的字串
謝謝
uj5u.com熱心網友回復:
您可以像這樣實作它(因為您已經使用<T>let使用 custom實作一般案例解決方案comparer):
public static IEnumerable<T> UniqueInOrder<T>(IEnumerable<T> source,
IEqualityComparer<T> comparer = null) {
if (null == source)
throw new ArgumentNullException(nameof(source));
comparer ??= EqualityComparer<T>.Default;
bool first = true;
T prior = default; // default: let compiler be happy
foreach (T item in source)
if (first || !comparer.Equals(item, prior)) {
prior = item;
first = false;
yield return item;
}
}
這里我們只檢查 currentitem是否等于prior。
演示:
string source = "AAAABBBCCDAABBB";
string result = string.Concat(UniqueInOrder(source));
Console.Write(result);
結果:
ABCDAB
編輯:請注意,Distinct()在
arr.Distinct()
洗掉整個 中的重復項arr,這就是為什么你只會得到 4 個不同的字符:
AAAABBBCCDAABBB -> ABCD
Distinct()
在給定的問題中,我們有一個較弱的條件:當前項不能等于先前項。
uj5u.com熱心網友回復:
這應該這樣做:
public static IEnumerable<T> UniqueInOrder<T>(IEnumerable<T> iterable)
{
using var e = iterable.GetEnumerator();
bool EnumeratorActive = e.MoveNext(); //start iterating
while (EnumeratorActive)
{
// set and yield the current value
T cur = e.Current;
yield return cur;
// keep advancing while the iterator is active and additional values match the current val
while(cur.Equals(e.Current) && (EnumeratorActive = e.MoveNext()))
{} //empty body intentional
}
}
它使用稱為Control/Break的嵌套 while 回圈模式,該模式仍以線性時間運行(因為只有內部回圈前進)。
這是一個沒有額外解釋器的簡化版本:
public static IEnumerable<T> UniqueInOrder<T>(IEnumerable<T> iterable)
{
using var e = iterable.GetEnumerator();
bool EnumeratorActive = e.MoveNext();
while (EnumeratorActive)
{
T cur = e.Current;
yield return cur;
while(cur.Equals(e.Current) && (EnumeratorActive = e.MoveNext()));
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/362611.html
