Проверка словаря - PullRequest
       10

Проверка словаря

0 голосов
/ 22 августа 2011

У меня есть список, и я получаю каждый элемент в списке в цикле foreach.

    private void saveButton_Click(object sender, EventArgs e)
    {
            if (saveFile1.ShowDialog() == DialogResult.OK)
            {
                StreamWriter sw = new StreamWriter(saveFile1.FileName);
                int i = 1;

                Dictionary<string, int> dictionary = new Dictionary<string, int>();

                foreach (var line in theFinalList)
                {
                    //compareList.Add(line.PartNumber[]);
                    if (!line.Name.Contains("FID") || !line.PartNumber.Contains("FIDUCIAL") ||
                        !line.PartNumber.Contains("EXCLUDES") || !line.PartNumber.Contains("excludes"))
                    {
                        //This doesn't work obviously.. :/
                        sw.WriteLine("( {0} 0 1 1 0 0 0 0 \"{1}\" \"{2}\" \"\" {3} 0 0 0 0 0 )",
                            i, line.PartDescription, line.PartNumber, partNumberOccurrences);
                    }

                    i++;
                }
            }

И у меня возникают проблемы с использованием словаря для сохранения каждой части строки в словаре и увеличения элемента itemCounter всякий раз, когда он обнаруживается как дубликат. Я пытаюсь сделать что-то подобное, но не могу понять логику для этого.

И я хотел бы вывести только partNumber 1 раз, а также количество раз, когда оно произошло, и соответствующее значение в той же строке, что и partNumber.

Вывод будет выглядеть так:

( 1 0 1 1 0 0 0 0 "2125R_1.0" "136380" "" 18 0 0 0 0 0 )
( 2 0 1 1 0 0 0 0 "2125R_1.0" "128587" "" 41 0 0 0 0 0 )
( 3 0 1 1 0 0 0 0 "2125R_1.0" "138409" "" 11 0 0 0 0 0 )
( 4 0 1 1 0 0 0 0 "2125R_1.0" "110984" "" 8 0 0 0 0 0 )
( 5 0 1 1 0 0 0 0 "3216R_1.3" "114441" "" 6 0 0 0 0 0 )
( 6 0 1 1 0 0 0 0 "3216C_1.3" "2006722" "" 16 0 0 0 0 0 )
( 7 0 1 1 0 0 0 0 "3216C_1.3" "135732" "" 6 0 0 0 0 0 )

Может кто-нибудь помочь мне с созданием словаря для этого?

Ответы [ 4 ]

2 голосов
/ 22 августа 2011

Вы также можете создать новый класс для ваших предметов и сохранить список этих предметов, а затем использовать Linq для группировки результатов - вы можете или не можете найти его более логичным:

public class MyItem
{
    public string Name { get; set; }
    public string PartNumber { get; set; } // I did this as string rather than int
    public string Description { get; set; }
}

public List<MyItem> items = new List<MyItem>();

Тогда,вы, кажется, хотите сгруппировать элементы (в этом примере используется Linq и предполагается, что вы заполнили список элементов):

IEnumerable<IGrouping<int, MyItem>> grouped = items
    .GroupBy(t => Convert.ToInt32(t.PartNumber))
    .OrderBy(t => t.Key);

foreach(var item in grouped)
{
    Console.WriteLine("Number of Occurances:" + item.Key);
    Console.WriteLine("Name: " + item.ElementAt(0).Name);
    Console.WriteLine("Description: " + item.ElementAt(0).Description);
    Console.WriteLine("\n --------------------------------- \n");
}

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

1 голос
/ 22 августа 2011

Я думаю, вы хотите что-то вроде этого:

int value;
if (!dictionary.TryGetValue(line.PartNumber, out value))
{
    value = 0;
}
dictionary[line.PartNumber] = value + 1;
0 голосов
/ 23 августа 2011
foreach (string word in lineList)
{
    if (dictionary.ContainsKey(word)
        dictionary[word]++;
    else
        dictionary[word] = 1;
}
0 голосов
/ 22 августа 2011

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

        var lines = new[]
                        {
                            "R80\t123456\tsomething here1",
                            "R81\t123456\tsomething here1",
                            "R81\t123456\tsomething here1",
                        };

        var items = lines.Select(i => i.Split('\t')).Select(i => new {Name = i[0], PartNumber = i[1], Description = i[2]});

        var outLines =
            items.GroupBy(i => i.Name).Select(
                i =>
                string.Format("{0}\t{1}\t{2}\t{3}", i.First().Name, i.First().PartNumber, i.First().Description,
                              i.Count()));

        foreach (var outLine in outLines)
        {
            Console.WriteLine(outLine);
        }

        Console.Read();
...