如何根据循环自动创建变量?

时间:2015-04-10 05:50:15

标签: c# arrays variables

我创建了一个程序,用于检查项目在数组中重复的次数。

但是,对于每个重复至少两次的项目,我想将其分配给变量。我的问题是,我的名单有时可能更大或更小。所以我需要我的循环通过,如果找到副本,创建一个int类型的变量并为其分配重复次数。我似乎记得在Java上读过关于这个的东西,但我忘记了它的名字,或者我只是感到困惑。请帮忙。谢谢。

更新:我希望输出如下:

(A:20) - (B:114) - (C:50) - (W:0)

目前我正在尝试检查是否

    string[] art = new string[] {"ABAR 200", "CDXE 500", "BKWR 250", "BTSQ 890", "DRTY 600"};
    string[] cd = new string[] {"A", "B"};

    int control = 0;

    //I will fill this in the first loop below with 
    //the first letter of each item in the art array
    ArrayList firstLetter = new ArrayList ();

    //this one gets filled after the second loop ends
    ArrayList numOfLetters = new ArrayList ();

    for(int k = 0; k < art.Length; k++){ //iterate 4 times, add 1st letter
        firstLetter.Add (art[k].Substring(0, 1));
    }

    for (int j = 0; j < art.Length; j++) { //iterate 4 times 
        //check how many times a letter repeats in 'art'
        while (firstLetter.Contains (art [j].Substring (0, 1))) {
            control++; //
    }
        numOfLetters.Add ("(" + art [j].Substring (0, 1) + " " + ":" + " " + 
                control + ")");
            control = 0;
        }
    print (numOfLetters[0]);

如果这一切都没有意义,我很乐意知道如何检查一个arraylist一封信重复多少次。

I,E;

的ArrayList 一个 乙 C 一个 d 一个 Ë ˚F

我想知道如何检查'A'重复多少次

3 个答案:

答案 0 :(得分:2)

我不太清楚代码块在做什么,所以我只是解决你的最后一个例子。首先,避免使用ArrayList。您可以在其中存储任何object,但您无法轻易告知对象的类型存储在其中。当您返回值时,您必须将它们取消装箱。这很痛苦。

相反,请使用样本中List<T> Tstring的{​​{1}}。

List<string> letters = new List<string> {"A", "B", "C", "A", "D", "A", "E", "F"};

使用LINQ(在您的情况下为字母)按值对原始数组进行分组,然后存储至少出现两次的任何值的计数。 (我修改了您的样本集以获得更多重复项。)

还有一个名为string.Join的内置方法,它接受一个集合,将其展平为单个字符串,并用其他字符串(" - "分隔集合的所有元素这里)。

var letters = new List<string> {"B", "A", "C", "A", "A", "B", "A", "B"};

var repeats = letters.GroupBy(i => i)
                     .Where(g => g.Count() >= 2)
                     .ToDictionary(t => t.Key, t => t.Count());

var output = string.Join(" - ", repeats.OrderBy(x => x.Key)
                                       .Select(x => string.Format("({0} : {1})", x.Key, x.Value)));

// output: "(A : 4) - (B : 3)"

答案 1 :(得分:1)

听起来你可能正在寻找Dictionary<T, int>。你没有提到数组中包含什么类型的项目,因此你想要将T替换为该类型的任何类型。

快速而肮脏的实现可能如下所示:

Dictionary<object, int> dict = new Dictionary<object, int>();
object[] objs = new object[] { ... };

for (int v = 0; v < objs.Length; v++)
{
    object obj = objs[v];

    int count = dict.TryGet(obj, out count) ? count : 0;
    dict[obj] = count + 1;
}

这听起来像CS家庭作业,所以我假设这可能是你正在寻找的,但如果这是用于制作,我很想用LINQ来做

Dictionary<object, int> dict = objs.GroupBy(c => c)
                                   .ToDictionary(c => c.Key, c => c.Count());

一旦您获得了字典,只需检查多个项目的值即可。您可以通过使用foreach或使用LINQ循环来完成此操作。

这是另一个超快速实现,您可能希望采用不同的方式。但这将抓住它的主旨。

foreach (var v in dict.ToList())
{
    if (v.Value < 2)
        dict.Remove(v.Key);
}

另一种可行的方法是使用HashSet<>,它一次只允许任何给定对象的一个​​实例。

object[] objs = new object[] { ... };
HashSet<object> buffer = new HashSet<object>();
HashSet<object> repeated = new HashSet<object>();

foreach (var v in objs)
{
    if(!buffer.Add(v))
    {
        repeated.Add(v);
    }
}

在这里,我遍历每个项目并将其添加到缓冲区HashSet<>。如果返回false,则表示已经添加了它,因此它是重复的。那时,我将它追加到第二个HashSet<>,这将是你的结果。我选择了List<>作为结果,因为我假设您不希望重复报告,如果项目在数组中出现两次以上。但除此之外,两者都有效。

答案 2 :(得分:0)

您的项目类:

class YourItem
{
    public int ItemId { get; set; }
    public string ItemName { get; set; }
}

现在我们填写一些项目清单并进行处理:

// defining example item list
var items = new List<YourItem>() { 
    new YourItem() { ItemId = 1, ItemName = "FirstItem" }, 
    new YourItem() { ItemId = 1, ItemName = "FirstItem" }, 
    new YourItem() { ItemId = 2, ItemName = "SecondItem" } };

var groups = items.GroupBy(item => item.ItemId) // grouping your items by id (or how do you compare them?) to be able to count repetitions
    .Where(group => group.Count() > 1) // filtering out those that are not repeated
    .Select(group => new { Item = group.First(), Sum = group.Count() }); // selecting Item and Count for each group.

// processing the results
foreach (var group in groups)
{
    Console.WriteLine(group.Item.ItemName + " " + group.Sum);
}

输出:

FirstItem 2