【问题标题】:Need to get a value from a collection?需要从集合中获取价值?
【发布时间】:2011-07-28 07:45:04
【问题描述】:

我有一个List<Detail> 类型的变量

public class Detail {
   public string L { get; set; }
   public string R { get; set; }
}

我还有一个字符串的值与 Detail.L 中的值匹配。

有没有一种简单的方法可以获得与此匹配的 Detail.R 的值?

【问题讨论】:

  • 是否要在列表详细信息中搜索指定字符串?
  • SortedDictionary 不起作用的任何原因?甚至 SortedDictionary .
  • 您有一个与 Detail.L 匹配的字符串,并且正在寻找一种方法来找到与此匹配的 Detail.R 的值?在这种情况下,值不是总是相同的吗?

标签: c#


【解决方案1】:

当然,使用 LINQ to Objects(假设您使用的是 .NET 3.5 或更高版本):

string searchText = "the string to look for";
var matchingR = details.First(d => d.L == searchText).R;

显然会找到 first 匹配项。如果你想得到所有个匹配,你可以这样做:

var matchingRs = details.Where(d => d.L == searchText)
                        .Select(d => d.R);

【讨论】:

  • 乔恩·斯基特;快如闪电:)
【解决方案2】:

这样得到所有匹配的左边:

IEnumerable<string> matchRightsToLeft(List<Detail> list, string left)
{
    return list.Where(l => l.left == left).Select(l => l.right);
}

或者对于第一个/唯一的匹配

string matchRightToLeft(List<Detail> list, string left)
{
    return list.Where(l => l.left == left).FirstOrDefault(l => l.right);
}

【讨论】:

  • 您的第二个错误 - FirstOrDefault 采用的函数是谓词,而不是投影。我还建议遵循 .NET 命名约定 :)
  • 谢谢乔恩。我可以争辩减轻我正在做的事情的情况,但我知道你也可以这样说。 ;-)
【解决方案3】:

如果 L 在您的情况下看起来是唯一的,那么最好在此处使用字典而不是列表。

var myList = new Dictionary<string,string>();

然后使用 L 作为键,R 作为字典的值。

通过调用myList.Add(newL,newR);添加条目

然后通过这样做获得一个条目:

string myR = myList[myL];

【讨论】:

  • 如果您要多次查询它是有道理的,并且不需要订购任何其他东西。如果您需要订单,并且不介意 O(N) 搜索(例如,您搜索的次数相对较少),那么在列表中就可以了。
【解决方案4】:
   string valueForL = "abc";
   List<Detail> details = new List<Detail>();
   string valueForR = (from d in details where d.L == valueForL select d.R).FirstOrDefault();

【讨论】:

    【解决方案5】:

    看看this thread 关于实现 IEquatable 接口。我想你会在那里找到你需要的一切。

    【讨论】:

      【解决方案6】:

      怎么样:

      IEnumerable<string> allR = Details.Where(d => Equals(d.L, otherString)).Select(d => d.R);
      

      【讨论】:

        【解决方案7】:

        for 循环将是执行此操作的基本方法。

        否则使用 Linq:

        var lString = SearchValue;
        DetailList.Where(o => o.R == lString) //This will give you a list of all the Detail object where R == lString.
        

        【讨论】:

          【解决方案8】:

          你可以试试 LINQ to Objects:

          string r = (from d in list where d.L.Equals(...) select d.R).FirstOrDefault();
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2023-04-04
            • 2014-11-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-12-18
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多