如何将LINQ查询中的不同值放入列表?

时间:2016-01-15 16:10:15

标签: c# xml linq

我看过类似问题的几个答案,但没有一个能解决我的问题。我需要做的就是从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查询中获取不同的值。有什么建议吗?

4 个答案:

答案 0 :(得分:4)

此时,您的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

答案 1 :(得分:1)

你有.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);
}

答案 2 :(得分:0)

如果您有一个简单值列表,则需要在选择中删除使用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());

答案 3 :(得分:0)

您可以尝试

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

获得非唯一列表后。