【问题标题】:How do I put distinct values from a LINQ query into a list?如何将 LINQ 查询中的不同值放入列表中?
【发布时间】:2016-01-16 00:24:24
【问题描述】:

我查看了几个类似问题的答案,但没有一个能解决我的问题。我需要做的就是从 LINQ 查询(查询 XML 文件)中获取不同的值并将它们放入列表中。这是我尝试过的:

 var XmlData = XDocument.Load("PathToFile");
    List<string> XmlItems = new List<string>();

    var XQuery = from m in XmlData.Root.Elements()
                 where m.Attribute("Category").Value.ToString().Equals("TheCategory")
                 select (m.Attribute("TheAttribute").Value).Distinct().ToString();

    XmlItems.AddRange(XQuery);

    foreach (var item in XmlItems)
    {
        ComboBoxTeams.Items.Add(item);
    }

Distinct() 函数调用未给出预期结果。我不熟悉如何从 LINQ 查询中获取不同的值。有什么建议吗?

【问题讨论】:

  • 我确定 Distinct 调用有效。它只是没有给你你所期望的。你能提供一些示例输入吗?

标签: c# xml linq


【解决方案1】:

此时,您的Distinct

var XQuery = from m in XmlData.Root.Elements()
             where m.Attribute("Category").Value.ToString().Equals("TheCategory")
             select (m.Attribute("TheAttribute").Value).Distinct().ToString();

仅适用于(m.Attribute("TheAttribute").Value),不适用于整个语句

您可能需要将其更改为

var XQuery = from m in XmlData.Root.Elements()
             where m.Attribute("Category").Value.ToString().Equals("TheCategory")
             select (m.Attribute("TheAttribute").Value.ToString()); //get everything first, ToString probably needed
var XQueryDistinct = XQuery.Distinct(); //get distinct among everything you got

【讨论】:

  • 这行得通。非常感谢。我不敢相信我没有想到这一点。
  • @ic3man7019 我几乎可以理解,因为这样的错误通常更难发现——尤其是编码员本人。 ;)
【解决方案2】:

您将 .ToString() 和 .Distinct() 放在错误的位置。

var XmlData = XDocument.Load("PathToFile");
List<string> XmlItems = new List<string>();

var XQuery = from m in XmlData.Root.Elements()
             where m.Attribute("Category").Value.ToString().Equals("TheCategory")
             select (m.Attribute("TheAttribute").Value).Distinct().ToString();

XmlItems.AddRange(XQuery);

foreach (var item in XmlItems)
{
    ComboBoxTeams.Items.Add(item);
}

变成:

var XmlData = XDocument.Load("PathToFile");
var XmlItems = (from m in XmlData.Root.Elements()
                 where m.Attribute("Category").Value.ToString().Equals("TheCategory")
                 select (m.Attribute("TheAttribute").Value.ToString())).Distinct();

foreach (var item in XmlItems)
{
    ComboBoxTeams.Items.Add(item);
}

【讨论】:

  • 这行不通,因为这行:XmlItems.AddRange(XQuery); 。我不确定Distinct() 函数对结果做了什么,但这样做是无效的。它表示列表的最佳重载匹配有一些无效参数。
  • 一开始我也是这么想的。
【解决方案3】:

如果你有一个简单值的列表,你需要在你的选择中去掉 Distinct 的使用并放在后面。

var XQuery = (from m in XmlData.Root.Elements()
             where m.Attribute("Category").Value.ToString().Equals("TheCategory")
             select (m.Attribute("TheAttribute").Value.ToString())).Distinct();

如果您有复杂的对象,您有两种选择:

使用morelinq,您可以使用 DistinctBy:

XmlItems.DistinctBy(x => x.WhateverProperty);

否则,您可以使用组:

XmlItems.GroupBy(x => x.idOrWhateverOtherProperty)
      .Select(g => g.First());

【讨论】:

    【解决方案4】:

    你可以试试

    var uniqueList = yourList.Distinct().ToList();
    

    在您获得非唯一列表之后。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-16
      • 1970-01-01
      • 1970-01-01
      • 2019-09-15
      • 1970-01-01
      相关资源
      最近更新 更多