【问题标题】:Check if an Implicitly typed variable contains a specific value检查隐式类型变量是否包含特定值
【发布时间】:2011-10-15 21:35:05
【问题描述】:

我有一个隐式变量,它采用一个包含 SQL 查询 (LINQ) 结果的列表。 这个集合代表一个列表的现有客户,之前选择的。
通过一个存储过程,我采用了一组新的客户端,这些客户端将用于填充下拉列表。如果已包含在现有条目列表中,则遍历这组数据我会排除这些记录。

如何使用隐式类型变量进行此检查?

var existingClients = (from doc in TBL_Documents
                       join c in TBL_CONTACT on doc.CONTACTID equals c.CONTACTID
                       where doc.DOCID.Equals(DocID)
                       select new { c.CONTACTID, c.FULLNAME }).ToList();


 var resultSet = sp_ActiveContacts(index).ToList();
 foreach (var record in resultSet)
 {
   //How could I achieve something like this if condition (like a List)?
   if (!existingClients.Contains(record.CONTACTID))            
   {                                
      optionTags += "<option value=" + record.CONTACTID + ">" + record.Name + "</option>";
   }                       
 }

如果可能,我希望避免创建一个临时列表来存储用于 if 条件的 CONTACTID。

【问题讨论】:

    标签: linq var


    【解决方案1】:

    匿名类型通过检查每个属性来测试相等性,所以你可以这样做:

    if (!existingClients.Contains(new { record.CONTACTID, record.FULLNAME }))
    

    (假设您的record 变量具有FULLNAME 属性。否则只需构造具有适当值的匿名对象。)

    请参阅this answer 了解更多信息。

    编辑

    更简单的可能是:

    if (!existingClients.Any(c => c.CONTACTID == result.CONTACTID))
    

    【讨论】:

    • 这无疑更具可读性。并且不需要创建与记录变量相关的其他值(您的示例中的结果)。
    【解决方案2】:

    感谢马特的好回答!在性能方面,您的建议与使用临时列表来存储 ID 并检查此列表有什么区别?

    ...
    List<Guid> existIDs = new List<Guid>();
    foreach (var c in existingContacts)
    {
      existIDs.Add(c.CONTACTID);
    }
    
    var resultSet = db.sp_PagingActiveContacts(idx, userLogin, range).ToList();
    foreach (var record in resultSet)
    {
    if (!existIDs.Contains(new {record.CONTACTID}))
    {  ....
    

    【讨论】:

    • 我认为你这样做不会有任何收获。 .Any() 调用几乎一样快,恕我直言,更具可读性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多