【问题标题】:swaping strings inside of a list using c#使用 c# 在列表中交换字符串
【发布时间】:2014-01-04 11:50:49
【问题描述】:

我有一个包含 f1、f2、f3、...、f6 等文件名的列表。我的

程序需要输出一个列表,文件名出现在

随机顺序如 f4,f1,f6,f2,f3,f5。 我想在列表中正确交换或移动字符串我有一个列表

名为 fileName 的大小 6 已经包含 6 个不同的文件名 I

我正在交换列表文件名中的文件名,如下所示和fil

也是一个用于记住当前字符串或文件名的字符串。

temp =-1;
foreach (Control control in tableLayoutPanel1.Controls) // run loop untill every control inside tablelayoutpanel1.Controls is check or read
{

Button btns = control as Button;                    // btn sotre the 

current button in table.contr 
if (btns != null)                                   // check btn got a button from 

the panel then
{
    temp++;
    int randomNumber = 0; 

    randomNumber = theArray[temp];   //this pic the random number from 0 index then 1 so on theArray already contains random number from 0 to 5 without any repitition and also tested
    fil = fileName[randomNumber];  //fil for holding string

    fileName[temp] = fileName[randomNumber]; // at filname[0] 

swap or shift filename[randomNumber] random are between 0 to 

5 and without repitition 
    fileName[randomNumber] = fil; // this line isnt even necessary 

but to be safe i wrot
    btns.BackgroundImage =  images[randomNumber];    // change 

btn image to current random image
    copyImages.Add(images[randomNumber]);

    btns.BackgroundImage = null;  // i purposely doing this :)


}

使用该代码我可以交换字符串,但我不能交换它们

正确,因为它只运行了 6 次,所以它应该交换 6 个字符串

(每个都有不同的名字)在6个不同位置的列表中

fileName 列表中,但它没有发生一些字符串是

显示两三次,希望有人指出我是什么

做错了,没有索引超出范围或异常错误

我测试了一百次,请帮忙谢谢和任何想法

建议或一段代码会很有帮助,fil 只是将字符串存储在 fileName[temp] 的位置:) 和temp 只是在循环中从 0 变为 5 我不想打乱它们我只想根据给定的索引交换它们,我在我的代码中执行但不能正确地使用它theArray 已经包含 suffle 索引我只想将fileName[0] 索引分配给theArray[temp]如果你想看看,我可以把我的项目发给你,只要给我发个嗨到我的个人资料中显示的 id 就可以了

【问题讨论】:

    标签: c# winforms swap shift


    【解决方案1】:

    因此,假设您有一个长度为 6 的列表和一个包含 0 到 5 个随机顺序的 int[6]

    List<String> newList = newList<String>();
    foreach(int position in theArray)
    {
       newList.Add(filename[pos]);
    }
    filename.Clear();
    fileName.AddRange(newList);
    

    将是一种方式。 或者你可以简单地做 filename = newList 而不必理会ClearAddRange

    【讨论】:

    • 谢谢。我试试看:)
    【解决方案2】:

    您在临时变量中存储了错误的字符串。

    fil = fileName[temp];  // index changed here
    fileName[temp] = fileName[randomNumber];
    fileName[randomNumber] = fil;
    

    【讨论】:

    • fil 只是将字符串存储在 fileName[temp] 的位置 :) 并且 temp 只是在循环中从 0 变为 5
    • 它不存储任何东西
    • 我的意思是为了交换元素,您通常必须将其中一个存储在临时变量中。您将要交换的第一个元素分配给临时(第 1 行),将第一个元素分配为第二个元素(第 2 行),最后将第二个元素分配为存储在临时(第 3 行)中的前第一个元素线)。现在我认为 fil 是您的临时文件,那么您将第一个作业的右侧(上面的第一行)弄错了。在您的代码中,在引用的第二行之后,fil == fileName[temp] == fileName[randomNumber],因此是重复的。
    • 好吧,但是在你的代码中 fil 不存储 fileName[temp] 而是 fileName[randomNumber]。
    【解决方案3】:

    这是一种对数组中的元素进行打乱的简单方法。基本上,您从一端到中间遍历数组,将每个元素与随机选择的元素交换。由于每次交换操作都会导致两个元素被随机放置,所以当我们到达中间时,整个数组就被打乱了。

    void Main()
    {
        var arr = new string[] {"a","b","c"};
        Shuffle(arr);
        // arr is now shuffled
    }
    
    public static void Shuffle<T>(T[] arr)
    {
        Random r = new Random();
        for(int i = arr.Length; i > arr.Length / 2; i--)
        {
            Swap(arr, r.Next(i), i -1);
        }
    }
    
    private static void Swap<T>(T[] arr, int first, int second)
    {
        T temp = arr[first];
        arr[first] = arr[second];
        arr[second] = temp;
    }
    

    【讨论】:

    • 我不想洗牌我只想根据给定的索引交换它们,我在我的代码中做的但不能正确theArray已经包含我只想分配的洗牌索引fileName[0] 索引到theArray[temp] 我可以把我的项目发给你,如果你想看看就给我发个嗨到我个人资料中显示的 ID
    猜你喜欢
    • 2013-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-26
    • 1970-01-01
    相关资源
    最近更新 更多