C#: Удалить дублирующиеся значения из словаря?

Я принял (и голосовал!) ответ @Brian, для первого указания на меня к FasterCSV. Тогда, когда я погуглил для нахождения драгоценного камня, я также нашел довольно полный пример в эта страница Wiki. Соединяя их, я обосновался на следующем коде.

Между прочим, команда для установки драгоценного камня: драгоценный камень sudo устанавливает fastercsv (весь нижний регистр)

require 'fastercsv'

class EntriesController < ApplicationController

  def getcsv
      entries = Entry.find(:all)
      csv_string = FasterCSV.generate do |csv| 
            csv << ["first","last"]
            entries.each do |e|
              csv << [e.firstName,e.lastName]
            end
          end
          send_data csv_string, :type => "text/plain", 
           :filename=>"entries.csv",
           :disposition => 'attachment'

  end


end

19
задан User 22 September 2009 в 20:38
поделиться

5 ответов

What do you want to do with the duplicates? If you don't mind which key you lose, just build another dictionary like this:

IDictionary<string, string> myDict = new Dictionary<string, string>();

myDict.Add("1", "blue");
myDict.Add("2", "blue");
myDict.Add("3", "red");
myDict.Add("4", "green");

HashSet<string> knownValues = new HashSet<string>();
Dictionary<string, string> uniqueValues = new Dictionary<string, string>();

foreach (var pair in myDict)
{
    if (knownValues.Add(pair.Value))
    {
        uniqueValues.Add(pair.Key, pair.Value);
    }
}

That assumes you're using .NET 3.5, admittedly. Let me know if you need a .NET 2.0 solution.

Here's a LINQ-based solution which I find pleasantly compact...

var uniqueValues = myDict.GroupBy(pair => pair.Value)
                         .Select(group => group.First())
                         .ToDictionary(pair => pair.Key, pair => pair.Value);
49
ответ дан 30 November 2019 в 02:11
поделиться

Джон превзошел меня в решении .NET 3.5, но это должно работать, если вам нужно решение .NET 2.0:

        List<string> vals = new List<string>();
        Dictionary<string, string> newDict = new Dictionary<string, string>();
        foreach (KeyValuePair<string, string> item in myDict)
        {
            if (!vals.Contains(item.Value))
            {
                newDict.Add(item.Key, item.Value);
                vals.Add(item.Value);
            }
        }
3
ответ дан 30 November 2019 в 02:11
поделиться
foreach (var key in mydict.Keys)
  tempdict[mydict[key]] = key;
foreach (var value in tempdict.Keys)
  uniquedict[tempdict[value]] = value;
1
ответ дан 30 November 2019 в 02:11
поделиться
Dictionary<string, string> test = new Dictionary<string,string>();
test.Add("1", "blue");
test.Add("2", "blue");
test.Add("3", "green");
test.Add("4", "red");
Dictionary<string, string> test2 = new Dictionary<string, string>();
foreach (KeyValuePair<string, string> entry in test)
{
    if (!test2.ContainsValue(entry.Value))
        test2.Add(entry.Key, entry.Value);
}
1
ответ дан 30 November 2019 в 02:11
поделиться

Решение методом перебора будет примерно таким, как

var result = dictionary
    .GroupBy(kvp => kvp.Value)
    .ToDictionary(grp => grp.First().Value, grp.Key)

, если вы действительно не заботитесь о ключе, используемом для представления группы дубликатов, и допустимо перестроить словарь.

7
ответ дан 30 November 2019 в 02:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: