返回字符串作为自定义对象列表中的属性出现的次数

时间:2016-09-28 15:37:36

标签: c# linq

我正在尝试返回一个列表,其中包含属性设置值的次数。

我正在尝试这样做,而无需对要查找的值进行硬编码,因此如果后端发生更改,我将不必添加新的代码行。

目前我有它工作,但我手动设置了值。

listCounts.Add(testList.Count(item => item.title == "Blah"));
listCounts.Add(testList.Count(item => item.title == null));
listCounts.Add(testListt.Count(item => item.title == "test"));
listCounts.Add(testList.Count(item => item.title == "Blarg"));

这当前有效,但如果有任何问题,我将不得不进入并对代码进行更改,这是我要避免的代码

2 个答案:

答案 0 :(得分:2)

取决于你真正想做的事情。看起来你想要那些按键(标题)的wach计数?

一种方法是按照你的头衔分组来计算,例如

var listCounts = testList.GroupBy(item => item.title);

作为使用它的一个例子:

    class Item
    {
        public string title;
    }

    static void Main(string[] args)
    {
        var testList = new List<Item>
        {
            new Item { title = "Blah" },
            new Item { title = "Blah" },
            new Item { title = "Blah" },
            new Item { title = null },
            new Item { title = null },
            new Item { title = "test" },
            new Item { title = "test" },
            new Item { title = "test" },
            new Item { title = "test" }
        };


        var listCounts = testList.GroupBy(item => item.title);

        foreach (var count in listCounts)
        {
            Console.WriteLine("{0}: {1}", count.Key ?? string.Empty, count.Count());
        }

        Console.ReadKey();

    }

缺点是你每次都在计算 - 就像我说的那样,这取决于你想要实现的目标。一个简单的改变会使它成为一个dicationary(string,int),每个标题都是一个键,值将是标题出现的次数。

修改

要使用字典,请将listCounts行更改为:

var listCounts = testList.GroupBy(t => t.title).ToDictionary(i => i.Key ?? string.Empty, i => i.Count()); 

(请注意,密钥不能为空,因此i.Key ?? string.Empty解决方法应该适用于您的目的)

答案 1 :(得分:1)

我们不知道你的后端是什么,但似乎你需要从中检索它们。

//string[] myStrings = new string[] { "Blah", null, "test", "Blarg" };
string[] myStrings = _backEnd.RetrieveValues();
listCounts.Add(testList.Count(item => myStrings.Contains(item)));