C#从列表中获取值等于object.value的对象

6

我有一个类的对象列表。在这个列表中,我想获取Table.name == "value"的对象。

Class Table{

    public string name;
    private string primarykey;
    private string[] columnNames;

    //some methods and functions
}

我的问题是,有没有一种有效的方法可以使用linq从这个列表中获取指定的对象,或者我只能使用基本的搜索算法遍历它。
通过基本的搜索算法,我是指:
foreach(Table t in tables)
{
    if(t.name == "value")
        return t;
}

那么,有没有更高效的方法来使用linq实现这个功能呢?

4
LINQ并不能让你的代码神奇地变快。因此,尽管你可以使用tables.Single(t => t.name == "value"),但它并不会更快。 - sloth
我知道这并不会使它更快,但使用LINQ可以使它更易读。 - kpp
如果您更关注可读性而不是效率,请确保在下次提问时指出 - 您在问题中两次谈到“效率”,但从未提到您实际上只想要更简单的代码。 - Jon Skeet
1个回答

15

你可以使用LINQ轻松完成它,但效率不会更高:

var match = tables.FirstOrDefault(t => t.name == value);

现在,如果没有符合条件的表格,match 将会是 null。您需要决定在这种情况下想要发生什么。
LINQ 代码更短,但仍需遍历列表中的每个表格,直到找到匹配项。
您可能想考虑使用 Dictionary<string,Table> 将名称映射到表格 - 但很明显,这要求每个名称只对应一个表格。此外,除非您确实有大量的表格,否则您可能会发现它实际上并不比原来快多少。它的时间复杂度是 O(1)(假设没有哈希冲突),而不是 O(n),但当 n 很小时,O(n) 已经足够快了。我强烈建议您在担心其效率之前先检查一下是否真正存在瓶颈。

我认为值得一提的是,LINQ 不会使代码更快。 - Hossam Barakat
4
像我一样做了两次。 - Jon Skeet
4
4分钟前发出询问,3分钟前已得到答复。 Skeet再次击中了目标。 - Memet Olsen
哦,太好了,看来我正在查看旧版本! - Hossam Barakat
@JonSkeet 是的,它并不更有效率,但我的意思是它没有被提到:),我确定我在你的第一个回答中没有注意到它。最终您是专家Jon先生 :) - Hossam Barakat
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接