我在C#中遇到的常见问题是我的解决方案好,愚蠢,合理吗? (高级初学者)

时间:2009-03-15 23:01:57

标签: c# linq-to-sql collections

好的,明白我来自Cold Fusion,所以我倾向于以CF的方式思考事物,而C#和CF与一般方法中的不同。

所以问题是:我想通过LINQ从SQL数据库中提取一个“表”(这就是我想到的),然后我想在内存中对它进行一些计算。这个“表”包含几个不同类型的6或7个值。

现在,我的解决方案是使用自定义类型的通用列表执行LINQ查询。所以我的例子是RelevanceTable。我提取了一些数据,我想对数据做一些评估,首先从.Contains开始。似乎.Contains想要在整个列表上行动或什么也不做。如果我有List<string>,我可以使用它,但如果我有List<ReferenceTableEntry>其中ReferenceTableEntry是我的自定义类型,我需要覆盖IEquatable并告诉编译器究竟“Equals”的含义。

虽然这似乎并不合理,但看起来似乎还有很长的路要走一个简单的问题,所以我有一种潜在的怀疑,认为我的方法在开始时是有缺陷的。

如果我想使用LINQ和.Contains,那么覆盖接口是唯一的方法吗?似乎只有一种方式来说明要操作哪个字段。除了LIST之外是否还有另外一种可能具有此功能的集合类型。我已经开始大量使用List了,虽然我看了看,看了一些其他但不一定是优秀的方法。

我不是在寻找一些精确的性能或紧凑性或可读性,只是想知道我是否在六角螺钉中使用Phillips头螺丝刀。如果我的方法是一个“体面的”,但不是最好的当然我想知道更好,但只是知道它在球场会给我一点点“是啊!我不是傻瓜!”在切换到另一种方法之前,我至少会完成我正在做的事情。

希望我解释得那么好。谢谢你的帮助。

4 个答案:

答案 0 :(得分:2)

您想要表的具体内容是什么?目前尚不清楚。但是,标准的LINQ(-to-Objects)方法可用于任何类型的集合(包括List<T>),允许任何范围的WhereFirstAnyAll等等。

那么:你想做什么?如果你有桌子,你想要什么价值?

作为猜测(基于Contains的东西) - 你只想要:

bool x= table.Any(x=>x.Foo == foo); // or someObj.Foo

答案 1 :(得分:2)

List类中的某些方法存在重载,这些方法接受委托(可选地以lambda表达式的形式),您可以使用它来指定要查找的字段。

例如,要查找Id属性为42的项目:

ReferenceTableEntry found = theList.Find(r => r.Id == 42);

found变量将引用匹配的第一个项目,如果没有项目匹配,则引用null

还有一些LINQ扩展需要委托或表达式。这与Find方法相同:

ReferenceTableEntry found = theList.FirstOrDefault(r => r.Id == 42);

答案 2 :(得分:1)

好的,所以如果我正确读到这个,你想使用contains方法。当对象集合(例如ReferenceTableEntry)使用它时,你需要小心,因为你所说的是你正在检查集合是否包含一个与你要比较的对象相同的对象。 / p>

如果使用.Find()或.FindAll()方法,则可以使用匿名方法指定要匹配的条件。

例如,如果您想在列表中找到Id大于1的所有ReferenceTableEntry记录,您可以执行类似这样的操作

List<ReferenceTableEntry> listToSearch = //populate list here
var matches = listToSearch.FindAll(x => x.Id > 1);

匹配将是ID大于1的ReferenceTableEntry记录列表。

尽管如此,但这并不完全清楚,这就是你要做的事情。

答案 3 :(得分:0)

这是涉及的LINQ查询,它创建了我正在讨论的对象,问题在于:

.Where(searchWord =&gt; queryTerms.Contains(searchWord.Word))

List<queryTerm> queryTerms = MakeQueryTermList();

public static List<RelevanceTableEntry> CreateRelevanceTable(List<queryTerm> queryTerms)
            {
            SearchDataContext myContext = new SearchDataContext();
            var productRelevance = (from pwords in myContext.SearchWordOccuranceProducts
            where (myContext.SearchUniqueWords
            .Where (searchWord => queryTerms.Contains(searchWord.Word))
            .Select (searchWord => searchWord.Id)).Contains(pwords.WordId)
            orderby pwords.WordId
            select new {pwords.WordId, pwords.Weight, pwords.Position, pwords.ProductId});
            }

此查询返回与提交的搜索字符串匹配的WordId列表(当它是List时,它只是单词,工作正常,因为作为前面提到的回答者,它们是相同类型的对象)。我的自定义类型此处是queryTerms,一个包含WordId,ProductId,Position和Weight的List。从那里开始,我通过对创建的对象进行各种操作来计算相关性。按产品计算“重量”,使用位置匹配来提升权重等。我保持这种分离的观点是,执行这些操作的规则将会改变,但所涉及的基本因素不会。我甚至会更加分离(我还在学习,我不想变得花哨)但是本地和解释LINQ查询的规则似乎让我感到沮丧。

由于CF一直支持查询查询,这就是我倾向于倾斜的方式。从数据库中提取所需的数据,然后在内存表中执行操作(包括带有聚合函数的查询)。

我希望这更清楚。