如何检查数组中的重复项,然后对其值执行某些操作?

时间:2012-02-15 18:01:05

标签: c# arrays

我有一个数组例如("1:2","5:90","7:12",1:70,"29:60")其中ID和Qty由':'(冒号)分隔,我想要做的是当有重复的ID时程序将添加数量和返回新的数组,所以在例子中它将成为(“1:72”,“5:90”,“7:12”,“29:60”)。

Ex.2("1:2","5:90","7:12","1:70","29:60","1:5")变为("1:77","5:90","7:12","29:60")。

我想在不使用linq的情况下解决它。

6 个答案:

答案 0 :(得分:3)

var foo = array.Select(s => s.Split(':'))
               .GroupBy(x => x[0])
               .Select(g => 
                    String.Format(
                        "{0}:{1}",
                        g.Key,
                        g.Sum(x => Int32.Parse(x[1]))
                    )
               )
               .ToArray();

注意,没有必要解析“键”,只需解析值。

没有LINQ:

var dictionary = new Dictionary<string, int>();
foreach (var group in array) {
    var fields = group.Split(':');
    if (!dictionary.ContainsKey(fields[0])) {
        dictionary.Add(fields[0], 0);
    }
    dictionary[fields[0]] += Int32.Parse(fields[1]);
}
string[] foo = new string[dictionary.Count];
int index = 0;
foreach (var kvp in dictionary) {
    foo[index++] = String.Format("{0}:{1}", kvp.Key, kvp.Value);
}

答案 1 :(得分:2)

您必须手动执行此操作。遍历每个列表,检查每个元素的ID。将其放在Dictionary<int, int>Dictionary<id, qt>中。如果字典包含id,请将其添加到值。

  1. 使用Dictionary类循环,添加,检查。

答案 2 :(得分:1)

(
    from raw in arr
        let splitted = raw.Split(':')
        let id = int.Parse(splitted[0])
        let qty = int.Parse(splitted[1])
        let data = new { id, qty }
        group data by data.id into grp
            let totalQty = grp.Sum(val => val.qty)
            let newStr = string.Format("{0}:{1}", grp.Key, totalQty
            select newStr
)
.ToArray()

请注意,代码可能包含意外错误,因为它是用记事本写的。

答案 3 :(得分:1)

var input=new string[]{"1:2","5:90","7:12","1:70","29:60","1:5"};
var result=input
             .Select(s=>s.Split(':'))
             .Select(x=>x.Select(s=>int.Parse(s)).ToArray())
             .GroupBy(x=>x[0])
             .Select(g=>g.Key+":"+g.Sum(x=>x[1]));

我懒得到处都说明文化。您可能希望在将其投入生产之前执行此操作,否则对于具有异常整数表示的文化将会失败。

var totals=new Dictionary<int,int>
foreach(string s in input)
{
  string[] parts=s.Split(':');
  int id=int.Parse(parts[0]);
  int quantity=int.Parse(parts[0]);
  int totalQuantity;
  if(!totals.TryGetValue(id,out totalQuantity))
      totalQuantity=0;//Yes I know this is redundant
  totalQuanity+=quantity;
  totals[id]=totalQuantity;
}
var result=new List<string>();
foreach(var pair in totals)
{
  result.Add(pair.Key+":"+pair.Value);
}

答案 4 :(得分:1)

如果你想要没有LINQ ......

var totalQuantities = new Dictionary<int, int>();
foreach(var raw in sourceArr) {
    var splitted = raw.Split(':');
    int id = int.Parse(splitted[0]);
    int qty = int.Parse(splitted[1]);
    if(!totalQuantities.ContainsKey(id)) {
        totalQuantities[id] = 0;
    }
    totalQuantities[id] += qty;
}

var result = new string[totalQuantities.Count];
int i=0;
foreach(var kvp in totalQuantities) {
    result[i] = string.Format("{0}:{1}", kvp.Key, kvp.Value);
    i++;
}

答案 5 :(得分:1)

试试这个:

List<string> items = new List<string>(new string[] { "1:2", "5:90", "7:12", "1:70", "29:60" });
Dictionary<string, int> dictionary = new Dictionary<string, int>();

foreach (string item in items)
{
    string[] data = item.Split(':');
    string key = data[0];

    if (!dictionary.ContainsKey(data[0]))
    {
        int value = dictionary[data[0]];
        dictionary[key] += int.Parse(data[1]);
    }
}

//Used dictionary values here