【问题标题】:How can i convert Linq var to List如何将 Linq var 转换为 List
【发布时间】:2013-02-27 18:20:29
【问题描述】:

我正在尝试将 Linq var 转换为 List.my c# 代码是

private List<HyperlinkInfo> GetHyperlinkByCode()
{
        TourInfoBusiness obj = new TourInfoBusiness();
        List<HyperlinkInfo> lst = new List<HyperlinkInfo>();
        lst = obj.GetAllHyperlink();
        //lst = lst.Select(x => x.Attraction).ToList();
        var k = lst.Select(x => x.Attraction).Distinct();            
}

如果你查看上面的代码直到 Line var k = lst.Select(x =&gt; x.Attraction).Distinct(); 是好的 现在我可以将 var k 转换为 List。

【问题讨论】:

  • HyperLinkInfo的属性是什么?

标签: c# asp.net linq list var


【解决方案1】:

根据您的 cmets,您需要为每个 Attraction 值(即字符串)提供一个 HyperlinInfo 对象。所以,使用分组和ToList()

private List<HyperlinkInfo> GetHyperlinkByCode()
{
        TourInfoBusiness obj = new TourInfoBusiness();
        List<HyperlinkInfo> lst = obj.GetAllHyperlink();
        return lst.GroupBy(x => x.Attraction) // group links by attraction
                  .Select(g => g.First()) // select first link from each group
                  .ToList(); // convert result to list
}

您也可以使用morelinq DistinctBy 扩展(可从 NuGet 获得):

private List<HyperlinkInfo> GetHyperlinkByCode()
{
        TourInfoBusiness obj = new TourInfoBusiness();
        List<HyperlinkInfo> lst = obj.GetAllHyperlink();
        return lst.DistinctBy(x => x.Attraction).ToList();
}

【讨论】:

    【解决方案2】:

    使用Enumerable.ToList&lt;TSource&gt; Method。只需在查询末尾添加ToList()

    return k.ToList();
    

    所以你的方法可以是:

    private List<HyperlinkInfo> GetHyperlinkByCode()
    {
            TourInfoBusiness obj = new TourInfoBusiness();
            List<HyperlinkInfo> lst = new List<HyperlinkInfo>();
            lst = obj.GetAllHyperlink();
            //lst = lst.Select(x => x.Attraction).ToList();
            var k = lst.Select(x => x.Attraction).Distinct();
            return k.ToList();
    }
    

    但是x.Attraction 应该是HyperLinkInfo 类型的对象。

    编辑:根据评论,x.Attraction 似乎是一个字符串,您需要在 select 语句中创建您的类 Project.Bll.HyperlinkInfo 的对象,然后返回该列表。比如:

    var k = lst.Select(new Project.Bll.HyperLinkInfo(x => x.Attraction)).Distinct();
    

    假设Project.Bll.HyperlinkInfo 构造函数采用字符串参数返回HyperLinkInfo 对象。

    【讨论】:

    • 它不起作用..错误消息是“错误 8 无法将类型 'System.Collections.Generic.List' 隐式转换为 'System.Collections.Generic.List'
    • @KartikPatel,查看编辑部分,需要选择HyperLinkInfo类型对象。
    • 仍然无法正常工作,并且 x.Attraction 是 HyperLinkInfo 类型对象的一部分。
    【解决方案3】:

    使用这个:

    var k = lst.Select(x => x.Attraction).Distinct().ToList();
    

    现在kx.Attraction 类型的列表。如果您的 x.Attractionstring,请使用:

    List<string> k = lst.Select(x => x.Attraction).Distinct().ToList();
    

    【讨论】:

    • 不工作...出现类似...无法将类型“System.Collections.Generic.List”隐式转换为“System.Collections.Generic.List'
    • 我必须返回 HyperLinkInfo 的对象。我不能使用 List
    • @KartikPatel 您选择了x.Attraction,它是字符串。您想如何将string 转换为HyperLinkInfo
    【解决方案4】:

    在查询中使用ToList()

    IEnumerable&lt;T&gt; 创建一个List&lt;T&gt;

    List<HyperlinkInfo> k = lst.Select(x => x.Attraction).Distinct().ToList();
    

    【讨论】:

    • 不工作....出现错误,例如无法将类型 'System.Collections.Generic.List' 隐式转换为 'System.Collections.Generic.List '
    【解决方案5】:

    试试这个添加 DistinctBy of moreLinq:

    public static IEnumerable<TSource> DistinctBy<TSource, TKey>
        (this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
    {
        HashSet<TKey> seenKeys = new HashSet<TKey>();
        foreach (TSource element in source)
        {
            if (seenKeys.Add(keySelector(element)))
            {
                yield return element;
            }
        }
    }
    

    并在您的代码中调用它:

    lst.DistinctBy(x => x.Attraction).toList();
    

    【讨论】:

      【解决方案6】:

      试试这个代码:

      return (List<Hyperlink Info>) k
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-07-18
        • 1970-01-01
        • 1970-01-01
        • 2011-10-27
        • 2015-06-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多