如何使用for回圈洗掉串列框中的重復項。我嘗試了幾種方法,但它們不起作用。我嘗試了最后一種方法,但沒有洗掉重復項,而是將它們替換為 0。
我的任務是在一個串列框中生成一個亂數,并在一個單獨的串列框中分離為偶數和奇數。然后我必須將平均值和選定的數字計算為立方體和平方根。一切正常。除了重復。需要一些幫助。
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace AssignmentQ1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void btnGenerate_Click(object sender, EventArgs e)
{
List<int> lstRN = new List<int>();
Random rnd = new Random();
int numbers = rnd.Next(1, 1000);
int item = 0;
int digit = 0;
int totalOdd, totalEven, countEven, countOdd;
totalOdd = totalEven = countEven = countOdd = 0;
double avg = 0.0;
double sum = 0.0;
for (int i=0; i<numbers; i )
{
item = rnd.Next(1, 300);
lstRN.Add(item);
}
lstRN.Sort();
digit = lstRN[0];
for (int k= 0; k<lstRN.Count; k )
{
if(lstRN[k] == digit)
{
lstRN[k]=0;
}
else
{
digit = lstRN[k];
}
}
foreach (int num in lstRN)
{
if(num % 2 == 0)
{
lstEven.Items.Add(num);
totalEven = num;
}
else
{
lstOdd.Items.Add(num);
totalOdd = num;
}
}
/**var _items1 = this.lstRN.Items.Cast<string>().Distinct().ToList();
this.lstRN.Items.Clear();
foreach (var item1 in _items1)
{
this.lstEven.Items.Add(item1);
}
var _items2 = this.lstRN.Items.Cast<string>().Distinct().ToList();
this.lstRN.Items.Clear();
foreach (var item2 in _items2)
{
this.lstOdd.Items.Add(item2);
}**/
countEven = lstEven.Items.Count;
lblCountEven.Text = countEven.ToString();
avg = item / countEven;
lblAverageEven.Text = avg.ToString();
countOdd = lstOdd.Items.Count;
lblCountOdd.Text = countOdd.ToString();
avg = item / countOdd;
lblAverageOdd.Text = avg.ToString();
}
private void lstEven_SelectedIndexChanged(object sender, EventArgs e)
{
string chosen = lstEven.SelectedItem.ToString();
int c = int.Parse(chosen);
double sr = Math.Sqrt(c);
lblSquare.Text = sr.ToString();
}
private void lstOdd_SelectedIndexChanged(object sender, EventArgs e)
{
string chosen = lstOdd.SelectedItem.ToString();
int c = int.Parse(chosen);
double cube = Math.Pow(c, 3);
lblCube.Text = cube.ToString();
}
private void btnExit_Click(object sender, EventArgs e)
{
Application.Exit();
}
}
}
uj5u.com熱心網友回復:
如果你是一個 LINQ 迷,你可以使用下面的擴展方法
public static IEnumerable<T> RemoveDuplicates<T>(this IEnumerable<T> source)
{
return source.GroupBy(x => x).Select(y => y.First());
}
它將收集所有相等的專案并選擇其中的第一個
uj5u.com熱心網友回復:
有專用的工具/型別 - HashSet<int>。
var uniqueNumbers = numbers.ToHashSet();
在集合中收集唯一的亂數
var randomNumbers = new HashSet<int>();
while (randomNumbers.Count < numbers)
{
var number = rnd.Next(1, 300);
randomNumbers.Add(number)
}
.Add僅當值尚未在集合中時,方法才會添加給定值。
HashSet.Add(T) 方法
uj5u.com熱心網友回復:
我嘗試了最后一種方法,但沒有洗掉重復項,而是將它們替換為 0。
好吧,這就是您的代碼正在做的事情,您正在用 0 替換重復項,因為您首先對串列進行排序,然后檢查當前 int 是否與最后一個相同:
for (int k = 0; k < lstRN.Count; k )
{
if (lstRN[k] == digit)
{
lstRN[k] = 0; // HERE
}
else
{
digit = lstRN[k];
}
}
因此,您可以執行以下操作:
- 在生成亂數時使用 a
HashSet<int>并檢查它是否已經包含新的(HashSet.Add回傳 abool)。如果是這樣重復它,所以使用回圈 - 用于
HashSet.ToList創建最終結果
您也可以將此方法與 aList<int>和 aContains檢查一起使用,但效率較低。
但是,在您的用例中,這將不起作用。您正在生成 1 到 299 之間的亂數:rnd.Next(1, 300)
但是串列應該有 1000 個數字,所以在 299 之后你不能再生成唯一的數字。
所以你需要一種不同的方法:
- 不要使用
rnd.Next(1, 300),但例如rnd.Next(1, 1000)(會很慢) - 不生成數字但生成隨機排序:
// generate a consecutive list of numbers, then sort it randomly
lstRN = Enumerable.Range(1, 299)
.Select(i => i)
.OrderBy(i => rnd.Next(1, 300))
.ToList();
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/433599.html
上一篇:如何擺脫這種重復?
