2017-09-12 248 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

相关问题