2017-09-12 247 views
-3

我在C#中關於System.Random命令的問題。將一串字符串加入到單個字符串中

我有這樣的MVC 4項目的查詢:

public JsonResult GetQuestions() 
{ 
    ... 
    var rnd = new Random(); 
    var selectedData = data.Select(y => new 
    { 
     ..., 
     qAnswers = ((y.qA1 != null ? "ab" : "") + 
        (y.qA2 != null ? "cd" : "") + 
        (y.qA3 != null ? "ef" : "") + 
        (y.qA4 != null ? "gh" : "") + 
        (y.qA5 != null ? "ij" : "")).OrderBy(item => rnd.Next()) 
    }); 

    return Json(selectedData, JsonRequestBehavior.AllowGet); 
} 

由於查詢的結果,我想看到的東西,如:

ijcdefabgh

但結果是:

["i","a","c","d","g","h","e","f","b","j"] 

你知道我的錯誤在哪裏嗎?或者我如何解決它?

+1

你的意思是你想要的是一個字符串,但你有一個字符串數組? –

+0

這個問題有兩個部分。首先,所需輸出不同於當前輸出,這是因爲隨機排列你的列。你需要刪除它。其次你得到的是需要串聯的字符串數組,以獲得所需的輸出使用'string.Join' –

+0

這將有助於如果這是一個https://stackoverflow.com/help/mcve – mjwills

回答

1

您必須創建一個字符串數組,以有「對」的字符串,然後將它洗,是這樣的:

var qAnswers = String.Concat(new string[] { (y.qA1 != null ? "ab" : ""), 
       (y.qA2 != null ? "cd" : ""), 
       (y.qA3 != null ? "ef" : ""), 
       (y.qA4 != null ? "gh" : ""), 
       (y.qA5 != null ? "ij" : "")} 
       .Where(item=>!string.IsNullOrEmpty(item)) 
       .OrderBy(item=>rnd.Next())); 
+0

太可愛了!我在這裏的答案是,但在符號正確之前,我知道你爲什麼使用.Where(item =>!string.IsNullOrEmpty(item))命令?另外,這是什麼意思? –

+0

因爲當你向數組添加字符串時,如果'y.qAx'爲空,你將添加一個空字符串。因此,'.Where(item =>!string.IsNullOrEmpty(item))'選擇數組中除了空的那些之外的所有字符串,因爲您不希望它們在最終結果中。最後你可能沒有必要使用'String'。Concat',但我認爲它會更清潔,以防萬一你想要這個數組@EmirhanÖZKAN – Pikoh

+0

@EmirhanÖZKAN所以如果你最後只需要字符串,你可以刪除那個Where子句,結果將是一樣的 – Pikoh

-1

擴大對我的評論任何答案被張貼之前:

問題:您正在通過將一串字符串與+相加來構建字符串。一個字符串是一個字符集合,所以當你OrderBy你實際上是洗牌的字符。 (通過C#交互控制檯):

("ab" + "cd" + "ef" + "gh" + "ij").OrderBy(x => Guid.NewGuid()) 

> OrderedEnumerable<char, Guid> { 'c', 'i', 'e', 'd', 'a', 'f', 'h', 'b', 'g', 'j' } 

解決方案:相反,你需要定義字符串的集合洗牌:

var ans = new List<string>(); 
ans.Add("ab"); 
ans.Add("cd"); 
ans.Add("ef"); 
ans.Add("gh"); 
ans.Add("ij"); 

qAnswers = String.Join("", ans.OrderBy(x => Guid.NewGuid())) 

> "cdijefghab" 
+0

永遠不要使用GUID作爲隨機性的來源。他們保證是*獨特*,而不是*隨機*。 –

+0

@EricLippert我們之前已經進行過精確的討論:https://codereview.stackexchange.com/q/164919/140484。對於快速混洗,在Random和NewGuid()之間進行選擇應該是任意的,在當前的Windows操作系統上,NewGuid()實際上使用CSPRNG而不是Random。如果隨機性是該應用程序的一個重要特性,那麼「隨機」或「Guid.NewGuid()」都不適用。 – BurnsBA

相關問題